|
|
1.1 root 1: /* $Source: /src386/usr/bin/pax/replace.c,v $
2: *
3: * $Revision: 1.1 $
4: *
5: * replace.c - regular expression pattern replacement functions
6: *
7: * DESCRIPTION
8: *
9: * These routines provide for regular expression file name replacement
10: * as required by pax.
11: *
12: * AUTHORS
13: *
14: * Mark H. Colburn, NAPS International
15: *
16: * Sponsored by The USENIX Association for public distribution.
17: *
18: * Copyright (c) 1989 Mark H. Colburn.
19: * All rights reserved.
20: *
21: * Redistribution and use in source and binary forms are permitted
22: * provided that the above copyright notice is duplicated in all such
23: * forms and that any documentation, advertising materials, and other
24: * materials related to such distribution and use acknowledge that the
25: * software was developed * by Mark H. Colburn and sponsored by The
26: * USENIX Association.
27: *
28: * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
29: * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
30: * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
31: *
32: * $Log: replace.c,v $
33: * Revision 1.1 92/08/28 08:03:04 bin
34: * Initial revision
35: *
36: * Revision 1.1 89/02/14 16:48:45 jep
37: * Initial revision
38: *
39: * Revision 1.1 88/12/23 18:02:36 mark
40: * Initial revision
41: *
42: */
43:
44: #ifndef lint
45: static char *ident = "$Id: replace.c,v 1.1 92/08/28 08:03:04 bin Exp Locker: bin $";
46: static char *copyright = "Copyright (c) 1989 Mark H. Colburn.\nAll rights reserved.\n";
47: #endif /* not lint */
48:
49: /* Headers */
50:
51: #include "pax.h"
52:
53:
54: /* add_replstr - add a replacement string to the replacement string list
55: *
56: * DESCRIPTION
57: *
58: * Add_replstr adds a replacement string to the replacement string
59: * list which is applied each time a file is about to be processed.
60: *
61: * PARAMETERS
62: *
63: * char *pattern - A regular expression which is to be parsed
64: */
65:
66: #if __STDC__
67:
68: void add_replstr(char *pattern)
69:
70: #else
71:
72: void add_replstr(pattern)
73: char *pattern;
74:
75: #endif
76: {
77: char *p;
78: char sep;
79: Replstr *rptr;
80: int len;
81:
82: if ((len = strlen(pattern)) < 4) {
83: warn("Replacement string not added",
84: "Malformed substitution syntax");
85: return;
86: }
87: if ((rptr = (Replstr *) malloc(sizeof(Replstr))) == (Replstr *)NULL) {
88: warn("Replacement string not added", "No space");
89: return;
90: }
91:
92: /* First character is the delimeter... */
93: sep = *pattern;
94:
95: /* Get trailing g and/or p */
96: p = pattern + len - 1;
97: while (*p != sep) {
98: if (*p == 'g') {
99: rptr->global = 1;
100: } else if (*p == 'p') {
101: rptr->print = 1;
102: } else {
103: warn(p, "Invalid RE modifier");
104: }
105: p--;
106: }
107:
108: if (*p != sep) {
109: warn("Replacement string not added", "Bad delimeters");
110: free(rptr);
111: return;
112: }
113: /* strip off leading and trailing delimeter */
114: *p = '\0';
115: pattern++;
116:
117: /* find the separating '/' in the pattern */
118: p = pattern;
119: while (*p) {
120: if (*p == sep) {
121: break;
122: }
123: if (*p == '\\' && *(p + 1) != '\0') {
124: p++;
125: }
126: p++;
127: }
128: if (*p != sep) {
129: warn("Replacement string not added", "Bad delimeters");
130: free(rptr);
131: return;
132: }
133: *p++ = '\0';
134:
135: /*
136: * Now pattern points to 'old' and p points to 'new' and both are '\0'
137: * terminated
138: */
139: if ((rptr->comp = regcomp(pattern)) == (regexp *)NULL) {
140: warn("Replacement string not added", "Invalid RE");
141: free(rptr);
142: return;
143: }
144: rptr->replace = p;
145: rptr->next = (Replstr *)NULL;
146: if (rplhead == (Replstr *)NULL) {
147: rplhead = rptr;
148: rpltail = rptr;
149: } else {
150: rpltail->next = rptr;
151: rpltail = rptr;
152: }
153: }
154:
155:
156:
157: /* rpl_name - possibly replace a name with a regular expression
158: *
159: * DESCRIPTION
160: *
161: * The string name is searched for in the list of regular expression
162: * substituions. If the string matches any of the regular expressions
163: * then the string is modified as specified by the user.
164: *
165: * PARAMETERS
166: *
167: * char *name - name to search for and possibly modify
168: */
169:
170: #if __STDC__
171:
172: void rpl_name(char *name)
173:
174: #else
175:
176: void rpl_name(name)
177: char *name;
178:
179: #endif
180: {
181: int found = 0;
182: int ret;
183: Replstr *rptr;
184: char buff[PATH_MAX + 1];
185: char buff1[PATH_MAX + 1];
186: char buff2[PATH_MAX + 1];
187: char *p;
188: char *b;
189:
190: strcpy(buff, name);
191: for (rptr = rplhead; !found && rptr != (Replstr *)NULL; rptr = rptr->next) {
192: do {
193: if ((ret = regexec(rptr->comp, buff)) != 0) {
194: p = buff;
195: b = buff1;
196: while (p < rptr->comp->startp[0]) {
197: *b++ = *p++;
198: }
199: p = rptr->replace;
200: while (*p) {
201: *b++ = *p++;
202: }
203: strcpy(b, rptr->comp->endp[0]);
204: found = 1;
205: regsub(rptr->comp, buff1, buff2);
206: strcpy(buff, buff2);
207: }
208: } while (ret && rptr->global);
209: if (found) {
210: if (rptr->print) {
211: fprintf(stderr, "%s >> %s\n", name, buff);
212: }
213: strcpy(name, buff);
214: }
215: }
216: }
217:
218:
219: /* get_disposition - get a file disposition
220: *
221: * DESCRIPTION
222: *
223: * Get a file disposition from the user. If the user enters 'y'
224: * the the file is processed, anything else and the file is ignored.
225: * If the user enters EOF, then the PAX exits with a non-zero return
226: * status.
227: *
228: * PARAMETERS
229: *
230: * char *mode - string signifying the action to be taken on file
231: * char *name - the name of the file
232: *
233: * RETURNS
234: *
235: * Returns 1 if the file should be processed, 0 if it should not.
236: */
237:
238: #if __STDC__
239:
240: int get_disposition(char *mode, char *name)
241:
242: #else
243:
244: int get_disposition(mode, name)
245: char *mode;
246: char *name;
247:
248: #endif
249: {
250: char ans[2];
251: char buf[PATH_MAX + 10];
252:
253: if (f_disposition) {
254: sprintf(buf, "%s %s? ", mode, name);
255: if (nextask(buf, ans, sizeof(ans)) == -1 || ans[0] == 'q') {
256: exit(0);
257: }
258: if (strlen(ans) == 0 || ans[0] != 'y') {
259: return(1);
260: }
261: }
262: return(0);
263: }
264:
265:
266: /* get_newname - prompt the user for a new filename
267: *
268: * DESCRIPTION
269: *
270: * The user is prompted with the name of the file which is currently
271: * being processed. The user may choose to rename the file by
272: * entering the new file name after the prompt; the user may press
273: * carriage-return/newline, which will skip the file or the user may
274: * type an 'EOF' character, which will cause the program to stop.
275: *
276: * PARAMETERS
277: *
278: * char *name - filename, possibly modified by user
279: * int size - size of allowable new filename
280: *
281: * RETURNS
282: *
283: * Returns 0 if successfull, or -1 if an error occurred.
284: *
285: */
286:
287: #if __STDC__
288:
289: int get_newname(char *name, int size)
290:
291: #else
292:
293: int get_newname(name, size)
294: char *name;
295: int size;
296:
297: #endif
298: {
299: char buf[PATH_MAX + 10];
300:
301: if (f_interactive) {
302: sprintf(buf, "rename %s? ", name);
303: if (nextask(buf, name, size) == -1) {
304: exit(0);
305: }
306: if (strlen(name) == 0) {
307: return(1);
308: }
309: }
310: return(0);
311: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.