Exemplo n.º 1
0
int
checker_read_double(
    int ind,
    const char *name,
    int eof_error_flag,
    double *p_val)
{
    double x;
    char sb[128], *db = 0, *vb = 0, *ep = 0;
    size_t ds = 0;

    if (!name) name = "";
    vb = checker_read_buf_2(ind, name, eof_error_flag, sb, sizeof(sb), &db, &ds);
    if (!vb) return -1;
    if (!*vb) {
        fatal_read(ind, _("%s: no double value"), name);
    }
    errno = 0;
    x = strtod(vb, &ep);
    if (*ep) {
        fatal_read(ind, _("%s: cannot parse double value"), name);
    }
    if (errno) {
        fatal_read(ind, _("%s: double value is out of range"), name);
    }
    *p_val = x;
    return 1;
}
Exemplo n.º 2
0
checker_sexpr_t
checker_read_sexpr(int ind)
{
  int c;
  checker_sexpr_t cur = 0, *plast = &cur, p, q;

  c = getc_unlocked(f_arr[ind]);
  while (c != EOF && isspace(c)) c = getc_unlocked(f_arr[ind]);
  if (c == EOF && ferror(f_arr[ind])) {
    fatal_CF(_("%s: input error"), gettext(f_arr_names[ind]));
  }
  if (c != EOF && c < ' ') {
    fatal_read(ind, _("Invalid control character with code %d"), c);
  }

  if (c == '(') {
    while (1) {
      c = getc_unlocked(f_arr[ind]);
      while (c != EOF && isspace(c)) c = getc_unlocked(f_arr[ind]);
      if (c == EOF && ferror(f_arr[ind])) {
        fatal_CF("%s: input error", gettext(f_arr_names[ind]));
      }
      if (c != EOF && c < ' ') {
        fatal_read(ind, _("Invalid control character with code %d"), c);
      }
      if (c == EOF) {
        fatal_read(ind, _("Unexpected EOF"));
      }
      if (c == ')') break;
      ungetc(c, f_arr[ind]);
      q = checker_read_sexpr(ind);
      p = xcalloc(1, sizeof(*p));
      p->p.kind = CHECKER_SEXPR_PAIR;
      p->p.head = q;
      *plast = p;
      plast = &p->p.tail;
    }
    return cur;
  }

  if (c == EOF && ferror(f_arr[ind])) {
    fatal_CF(_("%s: input error"), gettext(f_arr_names[ind]));
  }
  if (c == EOF) {
    fatal_read(ind, _("Unexpected EOF"));
  }
  ungetc(c, f_arr[ind]);
  p = xcalloc(1, sizeof(*p));
  p->a.kind = CHECKER_SEXPR_ATOM;
  p->a.value = read_atom(ind);
  return p;
}
Exemplo n.º 3
0
static unsigned char *
read_atom(int ind)
{
  int c;
  unsigned char *buf = 0, *tmp;
  size_t buf_a = 0, buf_u = 0;

  c = getc_unlocked(f_arr[ind]);
  while (c != EOF && isspace(c)) c = getc_unlocked(f_arr[ind]);
  if (c != EOF && c < ' ') {
    fatal_read(ind, _("Invalid control character with code %d"), c);
  }
  if (c == EOF && ferror(f_arr[ind])) {
    fatal_CF(_("%s: input error"), gettext(f_arr_names[ind]));
  }

  buf_a = 128;
  buf = alloca(buf_a);

  while (c != EOF && c != ')' && c != '(' && c > ' ') {
    if (buf_u + 1 >= buf_a) {
      buf_a *= 2;
      tmp = alloca(buf_a);
      memcpy(tmp, buf, buf_u);
      buf = tmp;
    }
    buf[buf_u++] = c;
    c = getc_unlocked(f_arr[ind]);
  }
  if (c != EOF && c < ' ' && !isspace(c)) {
    fatal_read(ind, _("Invalid control character with code %d"), c);
  }
  buf[buf_u] = 0;
  if (c != EOF) ungetc(c, f_arr[ind]);
  if (c == EOF && ferror(f_arr[ind])) {
    fatal_CF(_("%s: input error"), gettext(f_arr_names[ind]));
  }
  return xstrdup(buf);
}
Exemplo n.º 4
0
int
checker_read_long_long(
        int ind,
        const char *name,
        int eof_error_flag,
        long long *p_val)
{
  long long x;
  char sb[128], *db = 0, *vb = 0, *ep = 0;
  size_t ds = 0;

  if (!name) name = "";
  vb = checker_read_buf_2(ind, name, eof_error_flag, sb, sizeof(sb), &db, &ds);
  if (!vb) return -1;
  if (!*vb) {
    fatal_read(ind, _("%s: no int64 value"), name);
  }
  errno = 0;
  x = strtoll(vb, &ep, 10);
  if (*ep) fatal_read(ind, _("%s: cannot parse int64 value"), name);
  if (errno) fatal_read(ind, _("%s: int64 value is out of range"), name);
  *p_val = x;
  return 1;
}
Exemplo n.º 5
0
/**
   read a string (i.e. sequence of chars except whitespace)
   \param ind input stream index (0 - test in, 1 - program out, 2 - correct)
   \param name description of data to be read
   \param eof_error_flag if TRUE, EOF condition is error
   \param sbuf static buffer for the string
   \param ssz static buffer size for the string
   \param pdbuf pointer to dynamic buffer pointer
   \param pdsz pointer to dynamic buffer size
 */
char *
checker_read_buf_2(
        int ind,
        const char *name,
        int eof_error_flag,
        char *sbuf,
        size_t ssz,
        char **pdbuf,
        size_t *pdsz)
{
  int c, i = 0;
  char *dbuf = 0;
  size_t dsz = 0;

  c = getc(f_arr[ind]);
  while (isspace(c)) c = getc(f_arr[ind]);
  if (ferror(f_arr[ind])) {
    fatal_CF(_("%s: input error"), gettext(f_arr_names[ind]));
  }
  if (feof(f_arr[ind])) {
    if (eof_error_flag) fatal_read(ind, _("Unexpected EOF"));
    else return 0;
  }

  if (c < ' ') fatal_read(ind, _("Invalid control character %d"), c);

  if (sbuf && ssz > 1) {
    while (c != EOF && !isspace(c) && i + 1 < ssz) {
      if (c < ' ') fatal_read(ind, _("Invalid control character %d"), c);
      sbuf[i++] = c;
      c = getc(f_arr[ind]);
    }
    if (c == EOF) {
      if (ferror(f_arr[ind])) {
        fatal_CF(_("%s: input error"), gettext(f_arr_names[ind]));
      }
      sbuf[i] = 0;
      return sbuf;
    }
    if (isspace(c)) {
      ungetc(c, f_arr[ind]);
      sbuf[i] = 0;
      return sbuf;
    }
    if (!pdbuf || !pdsz) fatal_read(ind, _("Input element is too long"));
  } else {
    if (!pdbuf || !pdsz) fatal_CF(_("Invalid arguments"));
  }

  dbuf = *pdbuf;
  dsz = *pdsz;
  if (!dbuf || !dsz) {
    dsz = 32;
    while (i >= dsz) dsz *= 2;
    dbuf = (char *) xmalloc(dsz);
  } else {
    while (i >= dsz) dsz *= 2;
    dbuf = (char*) xrealloc(dbuf, dsz);
  }
  if (i > 0) memcpy(dbuf, sbuf, i + 1);

  while (c != EOF && !isspace(c)) {
    if (c < ' ') fatal_read(ind, _("Invalid control character %d"), c);
    if (i + 1 >= dsz) {
      dsz *= 2;
      dbuf = (char*) xrealloc(dbuf, dsz);
    }
    dbuf[i++] = c;
    c = getc(f_arr[ind]);
  }
  if (c == EOF) {
    if (ferror(f_arr[ind])) {
      fatal_CF(_("%s: input error"), gettext(f_arr_names[ind]));
    }
  } else {
    ungetc(c, f_arr[ind]);
  }
  dbuf[i] = 0;
  *pdbuf = dbuf;
  *pdsz = dsz;
  return dbuf;
}