summaryrefslogtreecommitdiff
path: root/sys/src/ape/cmd/pax/replace.c
diff options
context:
space:
mode:
authorTaru Karttunen <taruti@taruti.net>2011-03-30 15:46:40 +0300
committerTaru Karttunen <taruti@taruti.net>2011-03-30 15:46:40 +0300
commite5888a1ffdae813d7575f5fb02275c6bb07e5199 (patch)
treed8d51eac403f07814b9e936eed0c9a79195e2450 /sys/src/ape/cmd/pax/replace.c
Import sources from 2011-03-30 iso image
Diffstat (limited to 'sys/src/ape/cmd/pax/replace.c')
-rwxr-xr-xsys/src/ape/cmd/pax/replace.c308
1 files changed, 308 insertions, 0 deletions
diff --git a/sys/src/ape/cmd/pax/replace.c b/sys/src/ape/cmd/pax/replace.c
new file mode 100755
index 000000000..2eec5d562
--- /dev/null
+++ b/sys/src/ape/cmd/pax/replace.c
@@ -0,0 +1,308 @@
+/* $Source: /u/mark/src/pax/RCS/replace.c,v $
+ *
+ * $Revision: 1.2 $
+ *
+ * replace.c - regular expression pattern replacement functions
+ *
+ * DESCRIPTION
+ *
+ * These routines provide for regular expression file name replacement
+ * as required by pax.
+ *
+ * AUTHORS
+ *
+ * Mark H. Colburn, NAPS International
+ *
+ * Sponsored by The USENIX Association for public distribution.
+ *
+ * Copyright (c) 1989 Mark H. Colburn.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms are permitted
+ * provided that the above copyright notice is duplicated in all such
+ * forms and that any documentation, advertising materials, and other
+ * materials related to such distribution and use acknowledge that the
+ * software was developed * by Mark H. Colburn and sponsored by The
+ * USENIX Association.
+ *
+ * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
+ *
+ * $Log: replace.c,v $
+ * Revision 1.2 89/02/12 10:05:59 mark
+ * 1.2 release fixes
+ *
+ * Revision 1.1 88/12/23 18:02:36 mark
+ * Initial revision
+ *
+ */
+
+#ifndef lint
+static char *ident = "$Id: replace.c,v 1.2 89/02/12 10:05:59 mark Exp $";
+static char *copyright = "Copyright (c) 1989 Mark H. Colburn.\nAll rights reserved.\n";
+#endif /* not lint */
+
+/* Headers */
+
+#include "pax.h"
+
+
+/* add_replstr - add a replacement string to the replacement string list
+ *
+ * DESCRIPTION
+ *
+ * Add_replstr adds a replacement string to the replacement string
+ * list which is applied each time a file is about to be processed.
+ *
+ * PARAMETERS
+ *
+ * char *pattern - A regular expression which is to be parsed
+ */
+
+#ifdef __STDC__
+
+void add_replstr(char *pattern)
+
+#else
+
+void add_replstr(pattern)
+char *pattern;
+
+#endif
+{
+ char *p;
+ char sep;
+ Replstr *rptr;
+ int len;
+
+ if ((len = strlen(pattern)) < 4) {
+ warn("Replacement string not added",
+ "Malformed substitution syntax");
+ return;
+ }
+ if ((rptr = (Replstr *) malloc(sizeof(Replstr))) == (Replstr *)NULL) {
+ warn("Replacement string not added", "No space");
+ return;
+ }
+
+ /* First character is the delimeter... */
+ sep = *pattern;
+
+ /* Get trailing g and/or p */
+ p = pattern + len - 1;
+ while (*p != sep) {
+ if (*p == 'g') {
+ rptr->global = 1;
+ } else if (*p == 'p') {
+ rptr->print = 1;
+ } else {
+ warn(p, "Invalid RE modifier");
+ }
+ p--;
+ }
+
+ if (*p != sep) {
+ warn("Replacement string not added", "Bad delimeters");
+ free(rptr);
+ return;
+ }
+ /* strip off leading and trailing delimeter */
+ *p = '\0';
+ pattern++;
+
+ /* find the separating '/' in the pattern */
+ p = pattern;
+ while (*p) {
+ if (*p == sep) {
+ break;
+ }
+ if (*p == '\\' && *(p + 1) != '\0') {
+ p++;
+ }
+ p++;
+ }
+ if (*p != sep) {
+ warn("Replacement string not added", "Bad delimeters");
+ free(rptr);
+ return;
+ }
+ *p++ = '\0';
+
+ /*
+ * Now pattern points to 'old' and p points to 'new' and both are '\0'
+ * terminated
+ */
+ if ((rptr->comp = regcomp(pattern)) == (regexp *)NULL) {
+ warn("Replacement string not added", "Invalid RE");
+ free(rptr);
+ return;
+ }
+ rptr->replace = p;
+ rptr->next = (Replstr *)NULL;
+ if (rplhead == (Replstr *)NULL) {
+ rplhead = rptr;
+ rpltail = rptr;
+ } else {
+ rpltail->next = rptr;
+ rpltail = rptr;
+ }
+}
+
+
+
+/* rpl_name - possibly replace a name with a regular expression
+ *
+ * DESCRIPTION
+ *
+ * The string name is searched for in the list of regular expression
+ * substituions. If the string matches any of the regular expressions
+ * then the string is modified as specified by the user.
+ *
+ * PARAMETERS
+ *
+ * char *name - name to search for and possibly modify
+ */
+
+#ifdef __STDC__
+
+void rpl_name(char *name)
+
+#else
+
+void rpl_name(name)
+char *name;
+
+#endif
+{
+ int found = 0;
+ int ret;
+ Replstr *rptr;
+ char buff[PATH_MAX + 1];
+ char buff1[PATH_MAX + 1];
+ char buff2[PATH_MAX + 1];
+ char *p;
+ char *b;
+
+ strcpy(buff, name);
+ for (rptr = rplhead; !found && rptr != (Replstr *)NULL; rptr = rptr->next) {
+ do {
+ if ((ret = regexec(rptr->comp, buff)) != 0) {
+ p = buff;
+ b = buff1;
+ while (p < rptr->comp->startp[0]) {
+ *b++ = *p++;
+ }
+ p = rptr->replace;
+ while (*p) {
+ *b++ = *p++;
+ }
+ strcpy(b, rptr->comp->endp[0]);
+ found = 1;
+ regsub(rptr->comp, buff1, buff2);
+ strcpy(buff, buff2);
+ }
+ } while (ret && rptr->global);
+ if (found) {
+ if (rptr->print) {
+ fprintf(stderr, "%s >> %s\n", name, buff);
+ }
+ strcpy(name, buff);
+ }
+ }
+}
+
+
+/* get_disposition - get a file disposition
+ *
+ * DESCRIPTION
+ *
+ * Get a file disposition from the user. If the user enters 'y'
+ * the the file is processed, anything else and the file is ignored.
+ * If the user enters EOF, then the PAX exits with a non-zero return
+ * status.
+ *
+ * PARAMETERS
+ *
+ * char *mode - string signifying the action to be taken on file
+ * char *name - the name of the file
+ *
+ * RETURNS
+ *
+ * Returns 1 if the file should be processed, 0 if it should not.
+ */
+
+#ifdef __STDC__
+
+int get_disposition(char *mode, char *name)
+
+#else
+
+int get_disposition(mode, name)
+char *mode;
+char *name;
+
+#endif
+{
+ char ans[2];
+ char buf[PATH_MAX + 10];
+
+ if (f_disposition) {
+ sprintf(buf, "%s %s? ", mode, name);
+ if (nextask(buf, ans, sizeof(ans)) == -1 || ans[0] == 'q') {
+ exit(0);
+ }
+ if (strlen(ans) == 0 || ans[0] != 'y') {
+ return(1);
+ }
+ }
+ return(0);
+}
+
+
+/* get_newname - prompt the user for a new filename
+ *
+ * DESCRIPTION
+ *
+ * The user is prompted with the name of the file which is currently
+ * being processed. The user may choose to rename the file by
+ * entering the new file name after the prompt; the user may press
+ * carriage-return/newline, which will skip the file or the user may
+ * type an 'EOF' character, which will cause the program to stop.
+ *
+ * PARAMETERS
+ *
+ * char *name - filename, possibly modified by user
+ * int size - size of allowable new filename
+ *
+ * RETURNS
+ *
+ * Returns 0 if successfull, or -1 if an error occurred.
+ *
+ */
+
+#ifdef __STDC__
+
+int get_newname(char *name, int size)
+
+#else
+
+int get_newname(name, size)
+char *name;
+int size;
+
+#endif
+{
+ char buf[PATH_MAX + 10];
+
+ if (f_interactive) {
+ sprintf(buf, "rename %s? ", name);
+ if (nextask(buf, name, size) == -1) {
+ exit(0);
+ }
+ if (strlen(name) == 0) {
+ return(1);
+ }
+ }
+ return(0);
+}