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>
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)
15 66390331 2022-09-30 src uint8_t opts;
18 66390331 2022-09-30 src warn(const char *fmt, ...)
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);
28 66390331 2022-09-30 src fprintf(stderr, ": %s\n", w);
32 1e12e95d 2022-09-30 src err(int eval, const char *fmt, ...)
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);
42 1e12e95d 2022-09-30 src fprintf(stderr, ": %s\n", w);
47 b79428b4 2022-07-13 src strrep(char *from, char *to, char *s, char **new)
49 b79428b4 2022-07-13 src char *p = strrchr(s, '/');
51 b79428b4 2022-07-13 src if (*++p == '\0')
55 b79428b4 2022-07-13 src p = strstr(p, from);
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 :
66 66390331 2022-09-30 src p = (opts & O_REPLACELAST && temp) ? temp : p;
71 66390331 2022-09-30 src malloc(strlen(s) + strlen(to)*count - fromlen*count + 1))) {
72 66390331 2022-09-30 src warn("malloc");
76 b79428b4 2022-07-13 src char *newp = *new;
77 b79428b4 2022-07-13 src char *top = to;
79 b79428b4 2022-07-13 src for (; s != p; *newp++ = *s++)
81 b79428b4 2022-07-13 src for (; *top != '\0'; *newp++ = *top++)
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++)
88 b79428b4 2022-07-13 src p = (*p == '\0') ? NULL : p;
91 b79428b4 2022-07-13 src *newp = '\0';
96 b79428b4 2022-07-13 src ask(char *from, char *to)
98 b79428b4 2022-07-13 src fprintf(stderr, "replace %s with %s? ", from, to);
99 b79428b4 2022-07-13 src return getchar() == 'y';
103 b79428b4 2022-07-13 src ren(char *from, char *to, char *f)
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))
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);
121 66390331 2022-09-30 src fputs("usage: rene [-ailnov] from to file ...\n", stderr);
122 66390331 2022-09-30 src exit(EXIT_FAILURE);
126 b79428b4 2022-07-13 src main(int argc, char *argv[])
128 b79428b4 2022-07-13 src char *from, *to;
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");
136 b79428b4 2022-07-13 src while ((c = getopt(argc, argv, "ailnov")) != -1) {
137 b79428b4 2022-07-13 src switch (c) {
139 66390331 2022-09-30 src opts |= O_REPLACEALL;
142 66390331 2022-09-30 src opts |= O_INTERACTIVE;
145 66390331 2022-09-30 src opts |= O_REPLACELAST;
148 66390331 2022-09-30 src opts |= O_NOACT;
151 66390331 2022-09-30 src opts |= O_NOOVERRIDE;
154 66390331 2022-09-30 src opts |= O_VERBOSE;
160 b79428b4 2022-07-13 src argc -= optind;
161 b79428b4 2022-07-13 src argv += optind;
163 b79428b4 2022-07-13 src if (argc < 3)
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]);