X-Git-Url: http://git.marmaro.de/?p=mmh;a=blobdiff_plain;f=uip%2Fnew.c;h=60bb80637d7fe0690b46c0e2afff2c656d5ed3ba;hp=1ea90103c1110a925b5234b79e9cb40a779e1147;hb=a87df3543d3bc128ba4079d1f95638476ba5ca50;hpb=fede6e42d81ce34fd5c1bbe7fb2757b281c2573a diff --git a/uip/new.c b/uip/new.c index 1ea9010..60bb806 100644 --- a/uip/new.c +++ b/uip/new.c @@ -10,15 +10,16 @@ ** Inspired by Luke Mewburn's new: http://www.mewburn.net/luke/src/new */ +#include +#include +#include #include - #include #include #include - -#include -#include -#include +#include +#include +#include static struct swit switches[] = { #define MODESW 0 @@ -94,11 +95,10 @@ seq_in_list(char *name, char *sequences[]) static char * get_msgnums(char *folder, char *sequences[]) { + enum state state; + struct field f = free_field; char *seqfile = concat(toabsdir(folder), "/", mh_seq, (void *)NULL); FILE *fp = fopen(seqfile, "r"); - int state; - char name[NAMESZ], field[BUFSIZ]; - char *cp; char *msgnums = NULL, *this_msgnums, *old_msgnums; /* no sequences file -> no messages */ @@ -106,71 +106,39 @@ get_msgnums(char *folder, char *sequences[]) return NULL; } - /* copied from seq_read.c:seq_public */ - for (state = FLD;;) { - switch (state = m_getfld(state, name, field, sizeof(field), - fp)) { - case FLD: - case FLDPLUS: - case FLDEOF: - if (state == FLDPLUS) { - cp = getcpy(field); - while (state == FLDPLUS) { - state = m_getfld(state, name, field, - sizeof(field), fp); - cp = add(field, cp); - } - - /* - ** Here's where we differ from - ** seq_public: if it's in a - ** sequence we want, save the list - ** of messages. - */ - if (seq_in_list(name, sequences)) { - this_msgnums = trimcpy(cp); - if (msgnums == NULL) { - msgnums = this_msgnums; - } else { - old_msgnums = msgnums; - msgnums = concat(old_msgnums, " ", this_msgnums, (void *)NULL); - free(old_msgnums); - free(this_msgnums); - } - } - free(cp); - } else { - /* and here */ - if (seq_in_list(name, sequences)) { - this_msgnums = trimcpy(field); - if (msgnums == NULL) { - msgnums = this_msgnums; - } else { - old_msgnums = msgnums; - msgnums = concat(old_msgnums, " ", this_msgnums, (void *)NULL); - free(old_msgnums); - free(this_msgnums); - } + for (state = FLD2;;) { + switch (state = m_getfld2(state, &f, fp)) { + case FLD2: + /* + ** if it's in a sequence we want, + ** save the list of messages. + */ + if (seq_in_list(f.name, sequences)) { + this_msgnums = trimcpy(f.value); + if (msgnums == NULL) { + msgnums = this_msgnums; + } else { + old_msgnums = msgnums; + msgnums = concat(old_msgnums, " ", + this_msgnums, + (void *)NULL); + free(old_msgnums); + free(this_msgnums); } } - - if (state == FLDEOF) - break; continue; - case BODY: - case BODYEOF: - adios(NULL, "no blank lines are permitted in %s", - seqfile); - /* fall */ + case BODY2: + adios(EX_DATAERR, NULL, "no blank lines are permitted in %s", seqfile); + /* FALL */ - case FILEEOF: + case FILEEOF2: break; default: - adios(NULL, "%s is poorly formatted", seqfile); + adios(EX_SOFTWARE, NULL, "%s is poorly formatted", seqfile); } - break; /* break from for loop */ + break; } fclose(fp); @@ -256,7 +224,7 @@ check_folders(struct node **first, struct node **last, } else { fp = fopen(folders, "r"); if (fp == NULL) { - adios(NULL, "failed to read %s", folders); + adios(EX_IOERR, NULL, "failed to read %s", folders); } while (vfgets(fp, &line) == OK) { len = strlen(line) - 1; @@ -314,7 +282,7 @@ doit(char *cur, char *folders, char *sequences[]) char *sequences_s = NULL; int argc = 0; char *argv[MAXARGS]; - char *cp; + char **seqp; char buf[BUFSIZ]; if (cur == NULL || cur[0] == '\0') { @@ -391,8 +359,8 @@ doit(char *cur, char *folders, char *sequences[]) argv[argc++] = "scan"; snprintf(buf, sizeof buf, "+%s", node->n_name); argv[argc++] = buf; - for (cp=*sequences; *cp; cp++) { - argv[argc++] = cp; + for (seqp=sequences; *seqp; seqp++) { + argv[argc++] = *seqp; } argv[argc] = (char *)NULL; execprog(*argv, argv); @@ -457,28 +425,28 @@ main(int argc, char **argv) switch (smatch(++cp, switches)) { case AMBIGSW: ambigsw(cp, switches); - exit(1); + exit(EX_USAGE); case UNKWNSW: - adios(NULL, "-%s unknown", cp); + adios(EX_USAGE, NULL, "-%s unknown", cp); case HELPSW: snprintf(help, sizeof(help), "%s [switches] [sequences]", invo_name); print_help(help, switches, 1); - exit(0); + exit(argc == 2 ? EX_OK : EX_USAGE); case VERSIONSW: print_version(invo_name); - exit(0); + exit(argc == 2 ? EX_OK : EX_USAGE); case FOLDERSSW: if (!(folders = *argp++) || *folders == '-') - adios(NULL, "missing argument to %s", + adios(EX_USAGE, NULL, "missing argument to %s", argp[-2]); continue; case MODESW: if (!(invo_name = *argp++) || *invo_name == '-') - adios(NULL, "missing argument to %s", + adios(EX_USAGE, NULL, "missing argument to %s", argp[-2]); invo_name = mhbasename(invo_name); continue; @@ -512,7 +480,7 @@ main(int argc, char **argv) /* no sequence arguments; use unseen */ if ((unseen = context_find(usequence))) { if (!*unseen) { - adios(NULL, "profile entry %s set, but empty, and no sequences given", usequence); + adios(EX_CONFIG, NULL, "profile entry %s set, but empty, and no sequences given", usequence); } } else { unseen = seq_unseen; /* use default */ @@ -526,7 +494,7 @@ main(int argc, char **argv) folder = doit(context_find(curfolder), folders, sequences); if (folder == NULL) { - exit(0); + exit(EX_OK); return 1; }