Blame


1 66390331 2022-09-30 src #include <errno.h>
2 b79428b4 2022-07-13 src #include <stdarg.h>
3 b79428b4 2022-07-13 src #include <stdio.h>
4 b79428b4 2022-07-13 src #include <stdlib.h>
5 b79428b4 2022-07-13 src #include <string.h>
6 b79428b4 2022-07-13 src #include <unistd.h>
7 b79428b4 2022-07-13 src
8 66390331 2022-09-30 src #define O_INTERACTIVE 1
9 66390331 2022-09-30 src #define O_NOACT (1<<1)
10 66390331 2022-09-30 src #define O_NOOVERRIDE (1<<2)
11 66390331 2022-09-30 src #define O_REPLACEALL (1<<3)
12 66390331 2022-09-30 src #define O_REPLACELAST (1<<4)
13 66390331 2022-09-30 src #define O_VERBOSE (1<<5)
14 b79428b4 2022-07-13 src
15 66390331 2022-09-30 src uint8_t opts;
16 b79428b4 2022-07-13 src
17 b79428b4 2022-07-13 src void
18 66390331 2022-09-30 src warn(const char *fmt, ...)
19 b79428b4 2022-07-13 src {
20 66390331 2022-09-30 src char *w = strerror(errno);
21 66390331 2022-09-30 src fputs("rene: ", stderr);
22 b79428b4 2022-07-13 src if (fmt != NULL) {
23 b79428b4 2022-07-13 src va_list argp;
24 b79428b4 2022-07-13 src va_start(argp, fmt);
25 b79428b4 2022-07-13 src vfprintf(stderr, fmt, argp);
26 b79428b4 2022-07-13 src va_end(argp);
27 b79428b4 2022-07-13 src }
28 66390331 2022-09-30 src fprintf(stderr, ": %s\n", w);
29 b79428b4 2022-07-13 src }
30 b79428b4 2022-07-13 src
31 1e12e95d 2022-09-30 src void
32 1e12e95d 2022-09-30 src err(int eval, const char *fmt, ...)
33 1e12e95d 2022-09-30 src {
34 1e12e95d 2022-09-30 src char *w = strerror(errno);
35 1e12e95d 2022-09-30 src fputs("rene: ", stderr);
36 1e12e95d 2022-09-30 src if (fmt != NULL) {
37 1e12e95d 2022-09-30 src va_list argp;
38 1e12e95d 2022-09-30 src va_start(argp, fmt);
39 1e12e95d 2022-09-30 src vfprintf(stderr, fmt, argp);
40 1e12e95d 2022-09-30 src va_end(argp);
41 1e12e95d 2022-09-30 src }
42 1e12e95d 2022-09-30 src fprintf(stderr, ": %s\n", w);
43 1e12e95d 2022-09-30 src exit(eval);
44 1e12e95d 2022-09-30 src }
45 1e12e95d 2022-09-30 src
46 b79428b4 2022-07-13 src int
47 b79428b4 2022-07-13 src strrep(char *from, char *to, char *s, char **new)
48 b79428b4 2022-07-13 src {
49 b79428b4 2022-07-13 src char *p = strrchr(s, '/');
50 b79428b4 2022-07-13 src if (p) {
51 b79428b4 2022-07-13 src if (*++p == '\0')
52 b79428b4 2022-07-13 src return 0;
53 b79428b4 2022-07-13 src } else
54 b79428b4 2022-07-13 src p = s;
55 b79428b4 2022-07-13 src p = strstr(p, from);
56 b79428b4 2022-07-13 src if (!p)
57 b79428b4 2022-07-13 src return 0;
58 b79428b4 2022-07-13 src int fromlen = strlen(from);
59 b79428b4 2022-07-13 src int count = 1;
60 66390331 2022-09-30 src if (opts & O_REPLACELAST || opts & O_REPLACEALL) {
61 b79428b4 2022-07-13 src char *temp = p;
62 b79428b4 2022-07-13 src while (temp) {
63 b79428b4 2022-07-13 src temp = strstr(temp+fromlen, from);
64 66390331 2022-09-30 src count = (opts & O_REPLACEALL && temp) ? count + 1 :
65 66390331 2022-09-30 src count;
66 66390331 2022-09-30 src p = (opts & O_REPLACELAST && temp) ? temp : p;
67 b79428b4 2022-07-13 src }
68 b79428b4 2022-07-13 src }
69 b79428b4 2022-07-13 src
70 66390331 2022-09-30 src if (!(*new =
71 66390331 2022-09-30 src malloc(strlen(s) + strlen(to)*count - fromlen*count + 1))) {
72 66390331 2022-09-30 src warn("malloc");
73 b79428b4 2022-07-13 src return 0;
74 b79428b4 2022-07-13 src }
75 b79428b4 2022-07-13 src
76 b79428b4 2022-07-13 src char *newp = *new;
77 b79428b4 2022-07-13 src char *top = to;
78 b79428b4 2022-07-13 src while (p) {
79 b79428b4 2022-07-13 src for (; s != p; *newp++ = *s++)
80 b79428b4 2022-07-13 src ;
81 b79428b4 2022-07-13 src for (; *top != '\0'; *newp++ = *top++)
82 b79428b4 2022-07-13 src ;
83 b79428b4 2022-07-13 src s += fromlen;
84 66390331 2022-09-30 src p = opts & O_REPLACEALL ? strstr(s, from) : strchr(s, '\0');
85 b79428b4 2022-07-13 src p = p ? p : strchr(s, '\0');
86 b79428b4 2022-07-13 src for (; s != p; *newp++ = *s++)
87 b79428b4 2022-07-13 src ;
88 b79428b4 2022-07-13 src p = (*p == '\0') ? NULL : p;
89 b79428b4 2022-07-13 src top = to;
90 b79428b4 2022-07-13 src }
91 b79428b4 2022-07-13 src *newp = '\0';
92 b79428b4 2022-07-13 src return 1;
93 b79428b4 2022-07-13 src }
94 b79428b4 2022-07-13 src
95 b79428b4 2022-07-13 src int
96 b79428b4 2022-07-13 src ask(char *from, char *to)
97 b79428b4 2022-07-13 src {
98 b79428b4 2022-07-13 src fprintf(stderr, "replace %s with %s? ", from, to);
99 b79428b4 2022-07-13 src return getchar() == 'y';
100 b79428b4 2022-07-13 src }
101 b79428b4 2022-07-13 src
102 b79428b4 2022-07-13 src void
103 b79428b4 2022-07-13 src ren(char *from, char *to, char *f)
104 b79428b4 2022-07-13 src {
105 b79428b4 2022-07-13 src int yes = 1;
106 b79428b4 2022-07-13 src char *new = NULL;
107 b79428b4 2022-07-13 src if (!strrep(from, to, f, &new))
108 b79428b4 2022-07-13 src return;
109 66390331 2022-09-30 src if ((opts & O_NOOVERRIDE || opts & O_INTERACTIVE) &&
110 66390331 2022-09-30 src access(new, F_OK) == 0)
111 66390331 2022-09-30 src yes = opts & O_NOOVERRIDE ? 0 : ask(f, new);
112 66390331 2022-09-30 src if (yes && !(opts & O_NOACT) && !(yes += rename(f, new)))
113 66390331 2022-09-30 src warn("rename");
114 66390331 2022-09-30 src if (opts & O_VERBOSE && yes)
115 b79428b4 2022-07-13 src printf("%s -> %s\n", f, new);
116 b79428b4 2022-07-13 src }
117 b79428b4 2022-07-13 src
118 66390331 2022-09-30 src void
119 66390331 2022-09-30 src usage(void)
120 66390331 2022-09-30 src {
121 66390331 2022-09-30 src fputs("usage: rene [-ailnov] from to file ...\n", stderr);
122 66390331 2022-09-30 src exit(EXIT_FAILURE);
123 66390331 2022-09-30 src }
124 66390331 2022-09-30 src
125 b79428b4 2022-07-13 src int
126 b79428b4 2022-07-13 src main(int argc, char *argv[])
127 b79428b4 2022-07-13 src {
128 b79428b4 2022-07-13 src char *from, *to;
129 b79428b4 2022-07-13 src
130 1e12e95d 2022-09-30 src #ifdef __OpenBSD__
131 1e12e95d 2022-09-30 src if (pledge("stdio cpath rpath", NULL) == -1)
132 1e12e95d 2022-09-30 src err(1, "pledge");
133 1e12e95d 2022-09-30 src #endif
134 1e12e95d 2022-09-30 src
135 b79428b4 2022-07-13 src int c;
136 b79428b4 2022-07-13 src while ((c = getopt(argc, argv, "ailnov")) != -1) {
137 b79428b4 2022-07-13 src switch (c) {
138 b79428b4 2022-07-13 src case 'a':
139 66390331 2022-09-30 src opts |= O_REPLACEALL;
140 b79428b4 2022-07-13 src break;
141 b79428b4 2022-07-13 src case 'i':
142 66390331 2022-09-30 src opts |= O_INTERACTIVE;
143 b79428b4 2022-07-13 src break;
144 b79428b4 2022-07-13 src case 'l':
145 66390331 2022-09-30 src opts |= O_REPLACELAST;
146 b79428b4 2022-07-13 src break;
147 b79428b4 2022-07-13 src case 'n':
148 66390331 2022-09-30 src opts |= O_NOACT;
149 b79428b4 2022-07-13 src break;
150 b79428b4 2022-07-13 src case 'o':
151 66390331 2022-09-30 src opts |= O_NOOVERRIDE;
152 b79428b4 2022-07-13 src break;
153 b79428b4 2022-07-13 src case 'v':
154 66390331 2022-09-30 src opts |= O_VERBOSE;
155 b79428b4 2022-07-13 src break;
156 b79428b4 2022-07-13 src default:
157 b79428b4 2022-07-13 src usage();
158 b79428b4 2022-07-13 src }
159 b79428b4 2022-07-13 src }
160 b79428b4 2022-07-13 src argc -= optind;
161 b79428b4 2022-07-13 src argv += optind;
162 b79428b4 2022-07-13 src
163 b79428b4 2022-07-13 src if (argc < 3)
164 b79428b4 2022-07-13 src usage();
165 b79428b4 2022-07-13 src from = argv[0];
166 b79428b4 2022-07-13 src to = argv[1];
167 b79428b4 2022-07-13 src for (int i = 2; i < argc; i++)
168 b79428b4 2022-07-13 src ren(from, to, argv[i]);
169 b79428b4 2022-07-13 src return 0;
170 b79428b4 2022-07-13 src }