X-Git-Url: https://diplodocus.org/git/nmh/blobdiff_plain/81c57383273bb818858b2d7e6fdb4bbdb5df70d7..b3d4a4452c332fc3550db3fbdf9e02027b41e985:/sbr/fmt_compile.c?ds=sidebyside diff --git a/sbr/fmt_compile.c b/sbr/fmt_compile.c index 5fd7fc96..27af937e 100644 --- a/sbr/fmt_compile.c +++ b/sbr/fmt_compile.c @@ -1,6 +1,4 @@ - -/* - * fmt_compile.c -- "compile" format strings for fmt_scan +/* fmt_compile.c -- "compile" format strings for fmt_scan * * This code is Copyright (c) 2002, by the authors of nmh. See the * COPYRIGHT file in the root directory of the nmh distribution for @@ -37,17 +35,19 @@ * * - Add code to fmttest.c to display your new function. * - * - Document the new function in the mh-format(5) man page. + * - Document the new function in mh-format(5). * */ -#include -#include -#include -#include -#include -#include -#include +#include "h/mh.h" +#include "error.h" +#include "h/addrsbr.h" +#include "h/tws.h" +#include "h/fmt_scan.h" +#include "h/fmt_compile.h" +#include "h/mts.h" +#include "h/utils.h" +#include "terminal.h" #ifdef HAVE_SYS_TIME_H # include @@ -281,16 +281,17 @@ static struct colormap colortable[] = { /* * Find a component in the hash table. */ -#define FINDCOMP(comp,name) \ - for (comp = wantcomp[CHASH(name)]; \ - comp && strcmp(comp->c_name,name); \ - comp = comp->c_next) \ - ; +#define FINDCOMP(comp,name) do { \ + for (comp = wantcomp[CHASH(name)]; \ + comp && strcmp(comp->c_name,name); \ + comp = comp->c_next) \ + ; \ + } while (0) /* Add new component to the hash table */ #define NEWCOMP(cm,name) do { \ NEW0(cm);\ - cm->c_name = getcpy(name);\ + cm->c_name = mh_xstrdup(name);\ cm->c_refcount++;\ ncomp++;\ i = CHASH(name);\ @@ -298,9 +299,8 @@ static struct colormap colortable[] = { wantcomp[i] = cm; \ } while (0) -#define NEWFMT (next_fp++) -#define NEW(type,fill,wid) do {\ - fp=NEWFMT; fp->f_type=(type); fp->f_fill=(fill); fp->f_width=(wid); \ +#define NEW_FP(type,fill,wid) do {\ + fp=next_fp++; fp->f_type=(type); fp->f_fill=(fill); fp->f_width=(wid); \ } while (0) /* Add (possibly new) component to the hash table */ @@ -314,12 +314,12 @@ static struct colormap colortable[] = { cm->c_refcount++; \ } while (0) -#define LV(type, value) do { NEW(type,0,0); fp->f_value = (value); } while (0) -#define LS(type, str) do { NEW(type,0,0); fp->f_text = getcpy(str); fp->f_flags |= FF_STRALLOC; } while (0) +#define LV(type, value) do { NEW_FP(type,0,0); fp->f_value = (value); } while (0) +#define LS(type, str) do { NEW_FP(type,0,0); fp->f_text = getcpy(str); fp->f_flags |= FF_STRALLOC; } while (0) -#define PUTCOMP(comp) do { NEW(FT_COMP,0,0); ADDC(comp); } while (0) -#define PUTLIT(str) do { NEW(FT_LIT,0,0); fp->f_text = getcpy(str); fp->f_flags |= FF_STRALLOC; } while (0) -#define PUTC(c) do { NEW(FT_CHAR,0,0); fp->f_char = (c); } while (0) +#define PUTCOMP(comp) do { NEW_FP(FT_COMP,0,0); ADDC(comp); } while (0) +#define PUTLIT(str) do { NEW_FP(FT_LIT,0,0); fp->f_text = getcpy(str); fp->f_flags |= FF_STRALLOC; } while (0) +#define PUTC(c) do { NEW_FP(FT_CHAR,0,0); fp->f_char = (c); } while (0) static char *format_string; static char *usr_fstring; /* for CERROR */ @@ -347,17 +347,17 @@ static void free_comptable(void); static struct ftable * lookup(char *name) { - register struct ftable *t = functable; - register char *nm; - register char c = *name; + struct ftable *t = functable; + char *nm; + char c = *name; while ((nm = t->name)) { if (*nm == c && strcmp (nm, name) == 0) - return (ftbl = t); + return ftbl = t; t++; } - return (struct ftable *) 0; + return NULL; } @@ -367,7 +367,7 @@ compile_error(char *str, char *cp) int i, errpos, errctx; errpos = cp - format_string; - errctx = errpos > 20 ? 20 : errpos; + errctx = min(errpos, 20); usr_fstring[errpos] = '\0'; for (i = errpos-errctx; i < errpos; i++) { @@ -375,9 +375,9 @@ compile_error(char *str, char *cp) usr_fstring[i] = '_'; } - advise(NULL, "\"%s\": format compile error - %s", + inform("\"%s\": format compile error - %s", &usr_fstring[errpos-errctx], str); - adios (NULL, "%*s", errctx+1, "^"); + die("%*s", errctx+1, "^"); } /* @@ -389,16 +389,16 @@ compile_error(char *str, char *cp) int fmt_compile(char *fstring, struct format **fmt, int reset_comptable) { - register char *cp; + char *cp; size_t i; - static int comptable_initialized = 0; + static bool comptable_initialized; - format_string = getcpy (fstring); + format_string = mh_xstrdup(fstring); usr_fstring = fstring; if (reset_comptable || !comptable_initialized) { free_comptable(); - comptable_initialized = 1; + comptable_initialized = true; } /* it takes at least 4 char to generate one format so we @@ -420,14 +420,14 @@ fmt_compile(char *fstring, struct format **fmt, int reset_comptable) *fmt = formatvec; free(format_string); - return (ncomp); + return ncomp; } static char * compile (char *sp) { - register char *cp = sp; - register int c; + char *cp = sp; + int c; for (;;) { sp = cp; @@ -445,7 +445,7 @@ compile (char *sp) break; } if (c == 0) - return (cp); + return cp; switch (c = *++cp) { case '%': @@ -457,7 +457,7 @@ compile (char *sp) case '>': case '?': case ']': - return (cp); + return cp; case '<': cp = do_if(++cp); @@ -487,17 +487,15 @@ compile (char *sp) static char * do_spec(char *sp) { - register char *cp = sp; - register int c; -#ifndef lint - register int ljust = 0; -#endif /* not lint */ - register int wid = 0; - register char fill = ' '; + char *cp = sp; + int c; + bool ljust = false; + int wid = 0; + char fill = ' '; c = *cp++; if (c == '-') { - ljust++; + ljust = true; c = *cp++; } if (c == '0') { @@ -532,7 +530,7 @@ do_spec(char *sp) fp->f_width = wid; fp->f_fill = fill; - return (cp); + return cp; } /* @@ -543,10 +541,10 @@ do_spec(char *sp) static char * do_name(char *sp, int preprocess) { - register char *cp = sp; - register int c; - register int i; - static int primed = 0; + char *cp = sp; + int c; + int i; + static bool primed; while (isalnum(c = *cp++) || c == '-' || c == '_') ; @@ -562,7 +560,7 @@ do_name(char *sp, int preprocess) CERROR("component used as both date and address"); } if (cm->c_tws) { - memset (cm->c_tws, 0, sizeof *cm->c_tws); + ZERO(cm->c_tws); } else { NEW0(cm->c_tws); } @@ -575,10 +573,10 @@ do_name(char *sp, int preprocess) case FT_GETMYMBOX: case FT_GETMYADDR: if (!primed) { - ismymbox ((struct mailname *) 0); - primed++; + ismymbox(NULL); + primed = true; } - /* fall through */ + /* FALLTHRU */ case FT_PARSEADDR: if (cm->c_type & CT_DATE) { CERROR("component used as both date and address"); @@ -596,7 +594,7 @@ do_name(char *sp, int preprocess) cm->c_type |= CT_ADDR; break; } - return (cp); + return cp; } /* @@ -606,10 +604,10 @@ do_name(char *sp, int preprocess) static char * do_func(char *sp) { - register char *cp = sp; - register int c; - register struct ftable *t; - register int n; + char *cp = sp; + int c; + struct ftable *t; + int n; int mflag; /* minus sign in NUM */ infunction++; @@ -735,12 +733,12 @@ do_func(char *sp) } case TF_NOW: - LV(t->f_type, time((time_t *) 0)); + LV(t->f_type, time(NULL)); break; case TF_EXPR_SV: LV(FT_SAVESTR, 0); - /* fall through */ + /* FALLTHRU */ case TF_EXPR: *--cp = c; cp = do_expr(cp, t->extra); @@ -760,7 +758,7 @@ do_func(char *sp) CERROR("')' expected"); } --infunction; - return (cp); + return cp; } /* @@ -770,8 +768,8 @@ do_func(char *sp) static char * do_expr (char *sp, int preprocess) { - register char *cp = sp; - register int c; + char *cp = sp; + int c; if ((c = *cp++) == '{') { cp = do_name (cp, preprocess); @@ -779,13 +777,13 @@ do_expr (char *sp, int preprocess) } else if (c == '(') { cp = do_func (cp); } else if (c == ')') { - return (--cp); + return --cp; } else if (c == '%' && *cp == '<') { cp = do_if (cp+1); } else { CERROR ("'(', '{', '%<' or ')' expected"); } - return (cp); + return cp; } /* @@ -799,7 +797,7 @@ do_expr (char *sp, int preprocess) * * Okay, got some more information on this from John L. Romine! From an * email he sent to the nmh-workers mailing list on December 2, 2010, he - * explains it thusly: + * explains it so: * * In this case (scan, formatsbr) it has to do with an extension to * the mh-format syntax to allow for looping. @@ -831,7 +829,7 @@ do_expr (char *sp, int preprocess) static char * do_loop(char *sp) { - register char *cp = sp; + char *cp = sp; struct format *floop; floop = next_fp; @@ -855,10 +853,10 @@ do_loop(char *sp) static char * do_if(char *sp) { - register char *cp = sp; - register struct format *fexpr, - *fif = (struct format *)NULL; - register int c = '<'; + char *cp = sp; + struct format *fexpr, + *fif = NULL; + int c = '<'; for (;;) { if (c == '<') { /* doing an IF */ @@ -898,7 +896,7 @@ do_if(char *sp) fif = fp; /* loc of GOTO */ fexpr->f_skip = next_fp - fexpr; - fexpr = (struct format *)NULL;/* no extra ENDIF */ + fexpr = NULL; /* no extra ENDIF */ cp = compile (cp); /* compile ELSE stmts */ fif->f_skip = next_fp - fif; @@ -922,7 +920,7 @@ do_if(char *sp) if (fexpr) /* IF ... [ELSIF ...] ENDIF */ fexpr->f_skip = next_fp - fexpr; - return (cp); + return cp; } /* @@ -968,12 +966,11 @@ fmt_freecomptext(void) unsigned int i; struct comp *cm; - for (i = 0; i < sizeof(wantcomp)/sizeof(wantcomp[0]); i++) - for (cm = wantcomp[i]; cm; cm = cm->c_next) - if (cm->c_text) { - free(cm->c_text); - cm->c_text = NULL; - } + for (i = 0; i < DIM(wantcomp); i++) + for (cm = wantcomp[i]; cm; cm = cm->c_next) { + free(cm->c_text); + cm->c_text = NULL; + } } /* @@ -1001,7 +998,7 @@ fmt_findcasecomp(char *component) struct comp *cm; for (cm = wantcomp[CHASH(component)]; cm; cm = cm->c_next) - if (strcasecmp(component, cm->c_name ? cm->c_name : "") == 0) + if (strcasecmp(component, FENDNULL(cm->c_name)) == 0) break; return cm; @@ -1048,13 +1045,15 @@ fmt_addcompentry(char *component) int fmt_addcomptext(char *component, char *text) { - int i, found = 0, bucket = CHASH(component); + int i; + bool found = false; + int bucket = CHASH(component); struct comp *cptr = wantcomp[bucket]; char *cp; while (cptr) { - if (strcasecmp(component, cptr->c_name ? cptr->c_name : "") == 0) { - found++; + if (strcasecmp(component, FENDNULL(cptr->c_name)) == 0) { + found = true; if (! cptr->c_text) { cptr->c_text = getcpy(text); } else { @@ -1088,7 +1087,7 @@ fmt_appendcomp(int bucket, char *component, char *text) if (bucket != -1) { for (cptr = wantcomp[bucket]; cptr; cptr = cptr->c_next) - if (strcasecmp(component, cptr->c_name ? cptr->c_name : "") == 0) + if (strcasecmp(component, FENDNULL(cptr->c_name)) == 0) cptr->c_text = add(text, cptr->c_text); } } @@ -1105,7 +1104,7 @@ fmt_nextcomp(struct comp *comp, unsigned int *bucket) else comp = comp->c_next; - while (comp == NULL && *bucket < sizeof(wantcomp)/sizeof(wantcomp[0])) { + while (comp == NULL && *bucket < DIM(wantcomp)) { comp = wantcomp[(*bucket)++]; } @@ -1122,7 +1121,7 @@ free_comptable(void) unsigned int i; struct comp *cm, *cm2; - for (i = 0; i < sizeof(wantcomp)/sizeof(wantcomp[0]); i++) { + for (i = 0; i < DIM(wantcomp); i++) { cm = wantcomp[i]; while (cm != NULL) { cm2 = cm->c_next; @@ -1145,10 +1144,8 @@ free_component(struct comp *cm) { if (--cm->c_refcount <= 0) { /* Shouldn't ever be NULL, but just in case ... */ - if (cm->c_name) - free(cm->c_name); - if (cm->c_text) - free(cm->c_text); + free(cm->c_name); + free(cm->c_text); if (cm->c_type & CT_DATE) free(cm->c_tws); if (cm->c_type & CT_ADDR && cm->c_mn && cm->c_mn != &fmt_mnull)