+
+
+/********************************************************************
+ * Path Manipulation Routines.
+ ********************************************************************/
+
+/*
+ * These functions manipulate paths in "path_t" structures.
+ *
+ * They eliminate multiple slashes in paths when they notice them, and keep
+ * the path non-slash terminated.
+ *
+ * Both path_set() and path_append() return FALSE if the requested name
+ * would be too long.
+ */
+
+#define STRIP_TRAILING_SLASH(p) \
+ while ((p)->p_end > (p)->p_path && (p)->p_end[-1] == '/') \
+ { *--(p)->p_end = 0; };
+
+/*
+ * Move specified string into path. Convert "" to "." to handle BSD
+ * semantics for a null path. Strip trailing slashes.
+ */
+path_set(p, string)
+ path_t *p;
+ char *string;
+{
+ int len;
+
+ if (strlen(string) > MAXPATHLEN) {
+ fprintf(stderr, "cp: \"%s\": Name too long.\n", string);
+ exit_val = 1;
+ return FALSE;
+ }
+
+ (void) strcpy(p->p_path, string);
+ p->p_end = p->p_path + strlen(p->p_path);
+
+ if (p->p_path == p->p_end) {
+ *p->p_end++ = '.';
+ *p->p_end = 0;
+ }
+
+ STRIP_TRAILING_SLASH(p);
+
+ return TRUE;
+}
+
+/*
+ * Append specified string to path, inserting '/' if necessary. Return a
+ * pointer to the old end of path for restoration.
+ */
+char *
+path_append(p, name, len)
+ path_t *p;
+ char *name;
+ int len;