rem: if(strspn(colon_loc,"0123456789") != strlen(colon_loc) || *colon_loc=='0'){
add: if(strspn(colon_loc,"0123456789") != strlen(colon_loc) || *colon_loc=='0' || !*colon_loc){
context: static const char *format_parse(sf_node *sfn){  char *buf;                   /* temp copy of arg to hack on */  char *sep_loc;               /* separator location: " \t,\n" */  char *walk;  const char *err;       /* error code that could or did happen */  format_node *fnode;  int items;  int need_item;  static char errbuf[80]; /* for variable-text error message */  /*** prepare to operate ***/  buf = malloc(strlen(sfn->sf)+1);  strcpy(buf, sfn->sf);    /*** sanity check and count items ***/  need_item = 1; /* true */  items = 0;  walk = buf;  do{    switch(*walk){    case ' ': case ',': case '\t': case '\n': case '\0':    /* Linux extension: allow \t and \n as delimiters */      if(need_item){        free(buf);        goto improper;      }      need_item=1;      break;    case '=':      if(broken) goto out;      /* fall through */    default:      if(need_item) items++;      need_item=0;    }  } while (*++walk);out:  if(!items){    free(buf);    goto empty;  }#ifdef STRICT_LIST  if(need_item){    /* can't have trailing deliminator */    free(buf);    goto improper;  }#else  if(need_item){    /* allow 1 trailing deliminator */    *--walk='\0';  /* remove the trailing deliminator */  }#endif  /*** actually parse the list ***/  walk = buf;  while(items--){    format_node *endp;    char *equal_loc;    char *colon_loc;    sep_loc = strpbrk(walk," ,\t\n");    /* if items left, then sep_loc is not in header override */    if(items && sep_loc) *sep_loc = '\0';    equal_loc = strpbrk(walk,"=");    if(equal_loc){   /* if header override */      *equal_loc = '\0';      equal_loc++;    }    colon_loc = strpbrk(walk,":");    if(colon_loc){   /* if width override */      *colon_loc = '\0';      colon_loc++;      if(strspn(colon_loc,"0123456789") != strlen(colon_loc) || *colon_loc=='0'){        free(buf);        goto badwidth;      }    }    fnode =  do_one_spec(walk,equal_loc);    if(!fnode){      if(!*errbuf){  /* if didn't already create an error string */        snprintf(          errbuf,          sizeof(errbuf),          "Unknown user-defined format specifier \"%s\".",          walk        );      }      free(buf);      goto unknown;    }    if(colon_loc){      if(fnode->next){        free(buf);        goto notmacro;      }      // FIXME: enforce signal width to 8, 9, or 16 (grep: SIGNAL wide_signals)      fnode->width = atoi(colon_loc); // already verified to be a number    }    endp = fnode; while(endp->next) endp = endp->next;  /* find end */    endp->next = sfn->f_cooked;    sfn->f_cooked = fnode;    walk = sep_loc + 1; /* point to next item, if any */  }  free(buf);  already_parsed_format = 1;  return NULL;  /* errors may cause a retry looking for AIX format codes */  if(0) unknown:  err=errbuf;  if(0) empty:    err="Empty format list.";  if(0) improper: err="Improper format list.";  if(0) badwidth: err="Column widths must be unsigned decimal numbers.";  if(0) notmacro: err="Can't set width for a macro (multi-column) format specifier.";  if(strchr(sfn->sf,'%')) err = aix_format_parse(sfn);  return err;}