Example #1
0
static void file_parse_data(MetaData *metadata,
                       GString *parse_buffer,
                       const gchar *data,
                       gsize length,
                       GError **error) {
    g_return_if_fail(metadata != NULL);
    g_return_if_fail(error == NULL || *error == NULL);

    GError *parse_error;
    gsize i;

    g_return_if_fail(data != NULL || length == 0);

    parse_error = NULL;
    i = 0;
    while (i < length) {
        if (data[i] == '\n') {
            /* remove old style ascii termintaor */
            if (parse_buffer->len > 0
                && (parse_buffer->str[parse_buffer->len - 1]
                    == '\r'))
                g_string_erase(parse_buffer, parse_buffer->len - 1, 1);
            /* When a newline is encountered flush the parse buffer so that the
             * line can be parsed.  Completely blank lines are skipped.
             */
            if (parse_buffer->len > 0)
                flush_parse_buffer(metadata, parse_buffer, &parse_error);
            if (parse_error) {
                g_propagate_error(error, parse_error);
                return;
            }
            i++;
        } else {
            const gchar *start_of_line;
            const gchar *end_of_line;
            gsize line_length;

            start_of_line = data + i;
            end_of_line = memchr(start_of_line, '\n', length - i);

            if (end_of_line == NULL)
                end_of_line = data + length;

            line_length = end_of_line - start_of_line;

            g_string_append_len(parse_buffer, start_of_line, line_length);
            i += line_length;
        }
    }
}
Example #2
0
/* 
 * Put the NULL terminated string pointed to by *strp 
 * into the canonical object buffer.
 */
void canon_put_str (canon_info_t *cn, char *strp, int str_len) {

  if (cn->io == CANON_MEM && cn->buf_space_left <= str_len)
    cn->fd = flush_parse_buffer (cn);
  
  if (cn->io == CANON_MEM) {
    memcpy (cn->bufp, strp, str_len);
    if (verbose)
      fprintf(dfile, "canon_put_str mem (%s) offset (%ld): exit\n", strp,
              (long)(cn->bufp - parse_buf));
    cn->bufp += str_len - 1; /* lex tokens are '\0' terminated str's */
    cn->buf_space_left -= str_len - 1;
  }
  else{
    if (verbose) fprintf (dfile, "canon_put_str disk (%s) fpos (%ld) ", strp, ftell(cn->fd));
    if (fputs (strp, cn->fd) == EOF && verbose)
      fprintf (dfile, "canon_put_str () error (%s)\n", strerror (errno));
    if (verbose) fprintf (dfile, "fpos (%ld)\n", ftell(cn->fd));
  }
}
Example #3
0
static gboolean parse_testinfo_from_fd(MetaData *metadata,
                                       gint fd,
                                       GError **error) {
    g_return_val_if_fail(error == NULL || *error == NULL, FALSE);
    GError *tmp_error = NULL;
    gssize bytes_read;
    struct stat stat_buf;
    gchar read_buf[4096];
    GString *parse_buffer = g_string_sized_new(128);

    if (fstat(fd, &stat_buf) < 0) {
        g_set_error_literal(error, G_FILE_ERROR,
                            g_file_error_from_errno(errno),
                            g_strerror(errno));
        return FALSE;
    }

    if (!S_ISREG (stat_buf.st_mode)) {
        g_set_error_literal (error, G_FILE_ERROR,
                             RESTRAINT_OPEN,
                             "Not a regular file");
      g_string_free(parse_buffer, TRUE);
      return FALSE;
    }

    do {
        bytes_read = read(fd, read_buf, 4096);

        if (bytes_read == 0) /* End of File */
            break;

        if (bytes_read < 0) {
            if (errno == EINTR || errno == EAGAIN)
                continue;

            g_set_error_literal(error, G_FILE_ERROR,
                                g_file_error_from_errno(errno),
                                g_strerror(errno));
            g_string_free(parse_buffer, TRUE);
            return FALSE;
        }
        file_parse_data(metadata,
                        parse_buffer,
                        read_buf,
                        bytes_read,
                        &tmp_error);
    } while (!tmp_error);

    if (tmp_error) {
        g_propagate_error(error, tmp_error);
        g_string_free(parse_buffer, TRUE);
        return FALSE;
    }

    flush_parse_buffer(metadata, parse_buffer, &tmp_error);
    if (tmp_error) {
        g_propagate_error(error, tmp_error);
        g_string_free(parse_buffer, TRUE);
        return FALSE;
    }
    g_string_free(parse_buffer, TRUE);
    return TRUE;
}
Example #4
0
void parse_buf_add (canon_info_t *canon_obj, char *format, ...) {
  char *p, *q;
  int i, num_spaces;
  va_list ap;

  if (!canon_obj->do_canon)
    return;

if (verbose && canon_obj->io == CANON_DISK) fprintf (dfile, "parse_buf_add:fpos (%ld)\n", ftell (canon_obj->fd));
if (verbose) fprintf (dfile, "parse_buf_add:format (%s)\n", format);

  va_start (ap, format);
  
  for (p = format; *p; p++) {
    if (verbose) fprintf (dfile, "$%c$\n", *p);
    if (*p != '%') {
      if (canon_obj->io == CANON_MEM &&
	  canon_obj->buf_space_left <= 1)
	canon_obj->fd = flush_parse_buffer (canon_obj);

      if (canon_obj->io == CANON_MEM) {
	canon_obj->buf_space_left--;
	*canon_obj->bufp++ = *p;
      }
      else
	fputc (*p, canon_obj->fd);

      continue;
    }
    switch (*++p) {
    case 's': /* print string */
      q = va_arg (ap, char *);
      if (q != NULL) { /* ignore NULL strings */
	i = strlen (q);
	canon_put_str (canon_obj, q, i + 1);
      }
      break;
    case 'b': /* print spaces/blanks */
      /* first calculate the number of spaces */
      num_spaces = 0;
      for (q = ++p; *q >= '0' && *p <= '9'; q++)
        num_spaces = 10 * num_spaces + (*q - '0');
      p = --q; /* p get's incremented by the outer for loop */
      if (verbose) fprintf (dfile, "print blanks (%d) \n", num_spaces);
      if (canon_obj->io == CANON_MEM &&
	  canon_obj->buf_space_left <= num_spaces)
	canon_obj->fd = flush_parse_buffer (canon_obj);

      /* now print the spaces */
      if (canon_obj->io == CANON_MEM) {
	for (i = 0; i < num_spaces; i++)
	  *canon_obj->bufp++ = ' ';
	canon_obj->buf_space_left -= num_spaces;
      }
      else {
	if (verbose) fprintf (dfile, "before spaces fpos (%ld)\n", ftell (canon_obj->fd));
	for (i = 0; i < num_spaces; i++)
	  fputc (' ', canon_obj->fd);
	if (verbose) fprintf (dfile, "after spaces fpos (%ld)\n", ftell (canon_obj->fd));
      }
      break;
    case 'c': /* print a character */
      q = va_arg (ap, char *);
      if (canon_obj->io == CANON_MEM &&
	  canon_obj->buf_space_left <= 1)
	canon_obj->fd = flush_parse_buffer (canon_obj);

      if (canon_obj->io == CANON_MEM) {
	canon_obj->buf_space_left--;
	*canon_obj->bufp++ = *q;
      }
      else
	fputc (*q, canon_obj->fd);
      break;
    case 'z': /* print a string terminator/zero byte */
      /* want mem file buffer strings terminated by a NULL byte 
       * so that fputs () stops at end of line/end of lines can be
       * detected
       */
      if (canon_obj->io == CANON_MEM &&
	  canon_obj->buf_space_left <= 1)
	canon_obj->fd = flush_parse_buffer (canon_obj);

      if (canon_obj->io == CANON_MEM) {
	  *canon_obj->bufp++ = '\0';
	  canon_obj->buf_space_left--;
      }
      /* JW take out
      else
        fputc ('\0', canon_obj->fd))
	*/
      break;
    default:
      if (canon_obj->io == CANON_MEM &&
	  canon_obj->buf_space_left <= 1)
	canon_obj->fd = flush_parse_buffer (canon_obj);

      if (canon_obj->io == CANON_MEM) {
	*canon_obj->bufp++ = *p;
	canon_obj->buf_space_left--;
      }
      else
	fputc (*p, canon_obj->fd);
      break;
    }
  }

 va_end (ap);

if (verbose && canon_obj->io == CANON_DISK) fprintf (dfile, "parse_buf_add:fpos (%ld)\n", ftell (canon_obj->fd));

/* 
if (verbose)
  fprintf (dfile, "exit: parse buf siz (%d) space left (%d)\n", canon_obj->bufp - parse_buf, canon_obj->buf_space_left);
  */
}