void csadd(charset *cset1, const charset *cset2, errmsg_t errmsg) { charset *csu; csu = csunion(cset1,cset2,errmsg); if (*errmsg) return; csswap(csu,cset1); freecharset(csu); }
void csremove(charset *cset1, const charset *cset2, errmsg_t errmsg) { charset *csu; csu = csdiff(cset1,cset2,errmsg); if (*errmsg) return; csswap(csu,cset1); freecharset(csu); }
static void parsearg( const char *arg, int *phelp, int *pversion, charset *bodychars, charset *protectchars, charset *quotechars, int *phang, int *pprefix, int *prepeat, int *psuffix, int *pTab, int *pwidth, int *pbody, int *pcap, int *pdiv, int *pErr, int *pexpel, int *pfit, int *pguess, int *pinvis, int *pjust, int *plast, int *pquote, int *pReport, int *ptouch, errmsg_t errmsg ) /* Parses the command line argument in *arg, setting the objects pointed to */ /* by the other pointers as appropriate. *phelp and *pversion are boolean */ /* flags indicating whether the help and version options were supplied. */ { const char *savearg = arg; charset *chars, *change; char oc; int n; *errmsg = '\0'; if (*arg == '-') ++arg; if (!strcmp(arg, "help")) { *phelp = 1; return; } if (!strcmp(arg, "version")) { *pversion = 1; return; } if (*arg == 'B' || *arg == 'P' || *arg == 'Q' ) { chars = *arg == 'B' ? bodychars : *arg == 'P' ? protectchars : /* *arg == 'Q' */ quotechars ; ++arg; if (*arg != '=' && *arg != '+' && *arg != '-') goto badarg; change = parsecharset(arg + 1, errmsg); if (change) { if (*arg == '=') csswap(chars,change); else if (*arg == '+') csadd(chars,change,errmsg); else /* *arg == '-' */ csremove(chars,change,errmsg); freecharset(change); } return; } if (isdigit(*arg)) { if (!strtoudec(arg, &n)) goto badarg; if (n <= 8) *pprefix = n; else *pwidth = n; } for (;;) { while (isdigit(*arg)) ++arg; oc = *arg; if (!oc) break; n = -1; if (!strtoudec(++arg, &n)) goto badarg; if ( oc == 'h' || oc == 'p' || oc == 'r' || oc == 's' || oc == 'T' || oc == 'w') { if (oc == 'h') *phang = n >= 0 ? n : 1; else if (oc == 'p') *pprefix = n; else if (oc == 'r') *prepeat = n >= 0 ? n : 3; else if (oc == 's') *psuffix = n; else if (oc == 'T') *pTab = n >= 0 ? n : 8; else /* oc == 'w' */ *pwidth = n >= 0 ? n : 79; } else { if (n < 0) n = 1; if (n > 1) goto badarg; if (oc == 'b') *pbody = n; else if (oc == 'c') *pcap = n; else if (oc == 'd') *pdiv = n; else if (oc == 'E') *pErr = n; else if (oc == 'e') *pexpel = n; else if (oc == 'f') *pfit = n; else if (oc == 'g') *pguess = n; else if (oc == 'i') *pinvis = n; else if (oc == 'j') *pjust = n; else if (oc == 'l') *plast = n; else if (oc == 'q') *pquote = n; else if (oc == 'R') *pReport = n; else if (oc == 't') *ptouch = n; else goto badarg; } } return; badarg: sprintf(errmsg, "Bad argument: %.*s\n", errmsg_size - 16, savearg); *phelp = 1; }