Skip to content

Commit

Permalink
add mflag
Browse files Browse the repository at this point in the history
  • Loading branch information
leahneukirchen committed Jul 22, 2016
1 parent 5f98374 commit 733f42b
Show file tree
Hide file tree
Showing 2 changed files with 166 additions and 1 deletion.
3 changes: 2 additions & 1 deletion Makefile
@@ -1,6 +1,6 @@
CFLAGS=-g -O1 -Wall -Wno-switch -Wextra -fstack-protector-strong -D_FORTIFY_SOURCE=2

ALL = mscan mthread mhdr mshow mlist mseq msort mmime minc
ALL = mscan mthread mhdr mshow mlist mseq msort mmime minc mflag

all: $(ALL)

Expand All @@ -13,6 +13,7 @@ mseq: mseq.o seq.o
msort: msort.o blaze822.o seq.o
mmime: mmime.o
minc: minc.o
mflag: mflag.o blaze822.o seq.o

clean: FRC
-rm -f $(ALL) *.o
Expand Down
164 changes: 164 additions & 0 deletions mflag.c
@@ -0,0 +1,164 @@
#include <sys/types.h>

#include <dirent.h>
#include <errno.h>
#include <fcntl.h>
#include <limits.h>
#include <search.h>
#include <stdint.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>

#include "blaze822.h"

#define uc(c) ((c) & 0xdf)

static int8_t flags[255];
static int vflag = 0;

char **args;
ssize_t argsalloc = 256;
int idx = 0;
char *curfile;

void
add(char *file)
{
if (idx >= argsalloc) {
argsalloc *= 2;
if (argsalloc < 0)
exit(-1);
args = realloc(args, sizeof (char *) * argsalloc);
}
if (!args)
exit(-1);
args[idx] = strdup(file);
idx++;
}

void
flag(char *file)
{
int indent = 0;
while (file[indent] == ' ' || file[indent] == '\t')
indent++;

char *f = strstr(file, ":2,");
if (!f)
goto skip;

if (args) {
int i;
for (i = 0; i < idx; i++)
if (strcmp(file+indent, args[i]) == 0)
goto doit;
goto skip;
}

doit:
;
int8_t myflags[255] = { 0 };
char *s;
for (s = f+3; *s; s++)
myflags[(unsigned int)*s] = 1;

int changed = 0;
unsigned int i;
for (i = 0; i < sizeof myflags; i++) {
int z = myflags[i];
myflags[i] += flags[i];
if ((z <= 0 && myflags[i] > 0) ||
(z > 0 && myflags[i] <= 0))
changed = 1;
}
if (changed) {
char dst[PATH_MAX];
char *s = file;
char *t = dst;
while (s < f+3 && t < dst + sizeof dst - 1)
*t++ = *s++;
for (i = 0; i < sizeof myflags && t < dst + sizeof dst - 1; i++)
if (myflags[i] > 0)
*t++ = i;
*t = 0;

if (rename(file+indent, dst+indent) < 0) {
fprintf(stderr, "minc: can't rename '%s' to '%s': %s\n",
file+indent, dst+indent, strerror(errno));
goto skip;
}

if (strcmp(file+indent, curfile) == 0)
blaze822_seq_setcur(dst+indent);

printf("%s\n", dst);

return;
}

skip:
if (vflag)
printf("%s\n", file);
}

int
main(int argc, char *argv[])
{
int c;
while ((c = getopt(argc, argv, "PRSTDFprstdfX:x:v")) != -1)
switch(c) {
case 'P': case 'R': case 'S': case 'T': case 'D': case 'F':
flags[(unsigned int)c] = 1;
break;
case 'p': case 'r': case 's': case 't': case 'd': case 'f':
flags[(unsigned int)uc(c)] = -1;
break;
case 'X':
while (*optarg)
flags[(unsigned int)*optarg++] = 1;
break;
case 'x':
while (*optarg)
flags[(unsigned int)*optarg++] = -1;
break;
case 'v': vflag = 1; break;
default:
// XXX usage
exit(1);
}

curfile = blaze822_seq_cur();

if (vflag) {
args = calloc(sizeof (char *), argsalloc);
if (!args)
exit(-1);

if (argc == optind) {
char *cur[] = { "." };
blaze822_loop(1, cur, add);
} else {
blaze822_loop(argc-optind, argv+optind, add);
}

if (isatty(0)) {
char *all[] = { ":" };
blaze822_loop(1, all, flag);
} else {
blaze822_loop(0, 0, flag);
}

return 0;
}

if (argc == optind && isatty(0)) {
char *cur[] = { "." };
blaze822_loop(1, cur, flag);
} else {
blaze822_loop(argc-optind, argv+optind, flag);
}

return 0;
}

0 comments on commit 733f42b

Please sign in to comment.