add: }   if (((len < 3) || (p[0] != 'c')) && !cont) continue;    if (!cont) { p++; while (*p && isspace(*p)) p++;  if (*p != ':') { fprintf(stderr, "line %d:\n%s\n", lineno, line); for (i=0; i<(p-line); i++) { fprintf(stderr, "-"); } fprintf(stderr, "^\n"); fprintf(stderr, "error at column %d, line %d of %s: expecting ':'\n", p-line+1, lineno, infile); return -1; } p++; len = strlen(p);
context: int read_config(char * infile, char * config, unsigned int * pinno,                 char * desc, int desclen){  FILE * f;  char line[MAX_LINE_LEN];  char buf[MAX_LINE_LEN];  char configname[MAX_PIN_NAME];  int len, lineno, rc, cont;  char * p, * q;  int i;  for (i=0; i<N_PINS; i++)    pinno[i] = 0;  f = fopen(infile, "r");  if (f == NULL) {    fprintf(stderr, "%s: can't open config file \"%s\": %s\n",            progname, infile, strerror(errno));    return -1;  }  lineno = 0;  buf[0] = 0;  while (fgets(line, MAX_LINE_LEN, f) != NULL) {    lineno++;    p = line;    while (isspace(*p))      p++;    if ((*p == '#')||(*p == '\n')||(*p == 0))      continue;    len = strlen(p);    if (p[len-1] == '\n') {      p[len-1] = 0;      len--;    }    cont = 0;    if (p[len-1] == '\\') {      cont = 1;              /* flag that this is a continuation line */      /* trim trailing white space before continuation character */      q = &p[len-2];      while (isspace(*q))        q--;      q++;      *q = 0;    }    rc = strlcat(buf, p, MAX_LINE_LEN);    if (rc >= MAX_LINE_LEN) {      fprintf(stderr,               "%s: buffer length of %d exceed at line %d of \"%s\"\n",              progname, MAX_LINE_LEN, lineno, infile);      return -2;    }    if (cont)      continue;  /* continuation line, keep going */    /*     * read the configuration name from the beginning of the line     */    p = buf;    i = 0;    while (*p && (i < MAX_PIN_NAME) && (!(isspace(*p)||(*p == ':')))) {      configname[i++] = *p;      p++;    }    if (i == MAX_PIN_NAME) {      fprintf(stderr, "%s: configuration name too long at line %d of \"%s\"\n",              progname, lineno, infile);      return -3;    }    configname[i] = 0;    /*     * position 'p' to the beginning of the pin information     */    while (*p && (isspace(*p) || (*p == ':')))      p++;    if (strcasecmp(configname, config) == 0) {      strlcpy(desc, "no description", desclen);      rc = parse_config(lineno, infile, config, p, pinno, desc, desclen);      if (rc) {        fprintf(stderr, "%s: error parsing config file \"%s\" at line %d\n",                progname, infile, lineno);        return -3;      }      return 0;    }    buf[0] = 0;  }  /*   * config entry not found   */  fprintf(stderr, "%s: config entry \"%s\" not found in file \"%s\"\n",          progname, config, infile);  return -5;}