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; } } }
/* * 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)); } }
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; }
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); */ }