int resource_manager::do_begin_preview(const char *, int, FILE *fp, FILE *) { string buf; do { if (!ps_get_line(buf, fp)) { error("end of file in preview section"); break; } } while (!matches_comment(buf, "EndPreview")); return 0; }
/* Returns whether any text field in a component matches the specified string */ static gboolean matches_any (ECalComponent *comp, const gchar *str) { /* As an optimization, and to make life easier for the individual * predicate functions, see if we are looking for the empty string right * away. */ if (strlen (str) == 0) return TRUE; return (matches_comment (comp, str) || matches_description (comp, str) || matches_summary (comp, str) || matches_location (comp, str)); }
int resource_manager::do_begin_binary(const char *ptr, int, FILE *fp, FILE *outfp) { if (!outfp) return 0; unsigned count; if (!read_uint_arg(&ptr, &count)) return 0; if (outfp) fprintf(outfp, "%%%%BeginData: %u Binary Bytes\n", count); while (count != 0) { int c = getc(fp); if (c == EOF) { error("end of file within binary section"); return 0; } if (outfp) putc(c, outfp); --count; if (c == '\r') { int cc = getc(fp); if (cc != '\n') current_lineno++; if (cc != EOF) ungetc(cc, fp); } else if (c == '\n') current_lineno++; } skip_possible_newline(fp, outfp); string buf; if (!ps_get_line(buf, fp)) { error("missing %%%%EndBinary line"); return 0; } if (!matches_comment(buf, "EndBinary")) { error("bad %%%%EndBinary line"); if (outfp) fputs(buf.contents(), outfp); } else if (outfp) fputs("%%EndData\n", outfp); return 0; }
void resource_manager::process_file(int rank, FILE *fp, const char *filename, FILE *outfp) { // If none of these comments appear in the header section, and we are // just analyzing the file (ie outfp is 0), then we can return immediately. static const char *header_comment_table[] = { "DocumentNeededResources:", "DocumentSuppliedResources:", "DocumentNeededFonts:", "DocumentSuppliedFonts:", "DocumentNeededProcSets:", "DocumentSuppliedProcSets:", "DocumentNeededFiles:", "DocumentSuppliedFiles:", }; const int NHEADER_COMMENTS = sizeof(header_comment_table) / sizeof(header_comment_table[0]); struct comment_info { const char *name; int (resource_manager::*proc)(const char *, int, FILE *, FILE *); }; static comment_info comment_table[] = { { "BeginResource:", &resource_manager::do_begin_resource }, { "IncludeResource:", &resource_manager::do_include_resource }, { "BeginDocument:", &resource_manager::do_begin_document }, { "IncludeDocument:", &resource_manager::do_include_document }, { "BeginProcSet:", &resource_manager::do_begin_procset }, { "IncludeProcSet:", &resource_manager::do_include_procset }, { "BeginFont:", &resource_manager::do_begin_font }, { "IncludeFont:", &resource_manager::do_include_font }, { "BeginFile:", &resource_manager::do_begin_file }, { "IncludeFile:", &resource_manager::do_include_file }, { "EndProcSet", &resource_manager::change_to_end_resource }, { "EndFont", &resource_manager::change_to_end_resource }, { "EndFile", &resource_manager::change_to_end_resource }, { "BeginPreview:", &resource_manager::do_begin_preview }, { "BeginData:", &resource_manager::do_begin_data }, { "BeginBinary:", &resource_manager::do_begin_binary }, }; const int NCOMMENTS = sizeof(comment_table)/sizeof(comment_table[0]); string buf; int saved_lineno = current_lineno; const char *saved_filename = current_filename; current_filename = filename; current_lineno = 0; if (!ps_get_line(buf, fp)) { current_filename = saved_filename; current_lineno = saved_lineno; return; } if ((size_t)buf.length() < sizeof(PS_MAGIC) || memcmp(buf.contents(), PS_MAGIC, sizeof(PS_MAGIC) - 1) != 0) { if (outfp) { do { if (!(broken_flags & STRIP_PERCENT_BANG) || buf[0] != '%' || buf[1] != '!') fputs(buf.contents(), outfp); } while (ps_get_line(buf, fp)); } } else { if (!(broken_flags & STRIP_PERCENT_BANG) && outfp) fputs(buf.contents(), outfp); int in_header = 1; int interesting = 0; int had_extensions_comment = 0; int had_language_level_comment = 0; for (;;) { if (!ps_get_line(buf, fp)) break; int copy_this_line = 1; if (buf[0] == '%') { if (buf[1] == '%') { const char *ptr; int i; for (i = 0; i < NCOMMENTS; i++) if ((ptr = matches_comment(buf, comment_table[i].name))) { copy_this_line = (this->*(comment_table[i].proc))(ptr, rank, fp, outfp); break; } if (i >= NCOMMENTS && in_header) { if ((ptr = matches_comment(buf, "EndComments"))) in_header = 0; else if (!had_extensions_comment && (ptr = matches_comment(buf, "Extensions:"))) { extensions |= parse_extensions(ptr); // XXX handle possibility that next line is %%+ had_extensions_comment = 1; } else if (!had_language_level_comment && (ptr = matches_comment(buf, "LanguageLevel:"))) { unsigned ll; if (read_uint_arg(&ptr, &ll) && ll > language_level) language_level = ll; had_language_level_comment = 1; } else { for (i = 0; i < NHEADER_COMMENTS; i++) if (matches_comment(buf, header_comment_table[i])) { interesting = 1; break; } } } if ((broken_flags & STRIP_STRUCTURE_COMMENTS) && (matches_comment(buf, "EndProlog") || matches_comment(buf, "Page:") || matches_comment(buf, "Trailer"))) copy_this_line = 0; } else if (buf[1] == '!') { if (broken_flags & STRIP_PERCENT_BANG) copy_this_line = 0; } } else in_header = 0; if (!outfp && !in_header && !interesting) break; if (copy_this_line && outfp) fputs(buf.contents(), outfp); } } current_filename = saved_filename; current_lineno = saved_lineno; }
int resource_manager::do_begin_data(const char *ptr, int, FILE *fp, FILE *outfp) { while (white_space(*ptr)) ptr++; const char *start = ptr; unsigned numberof; if (!read_uint_arg(&ptr, &numberof)) return 0; static const char *types[] = { "Binary", "Hex", "ASCII" }; const int Binary = 0; int type = 0; static const char *units[] = { "Bytes", "Lines" }; const int Bytes = 0; int unit = Bytes; while (white_space(*ptr)) ptr++; if (*ptr != '\0') { type = read_one_of(&ptr, types, 3); if (type < 0) { error("bad data type"); return 0; } while (white_space(*ptr)) ptr++; if (*ptr != '\0') { unit = read_one_of(&ptr, units, 2); if (unit < 0) { error("expected `Bytes' or `Lines'"); return 0; } } } if (type != Binary) return 1; if (outfp) { fputs("%%BeginData: ", outfp); fputs(start, outfp); } if (numberof > 0) { unsigned bytecount = 0; unsigned linecount = 0; do { int c = getc(fp); if (c == EOF) { error("end of file within data section"); return 0; } if (outfp) putc(c, outfp); bytecount++; if (c == '\r') { int cc = getc(fp); if (cc != '\n') { linecount++; current_lineno++; } if (cc != EOF) ungetc(c, fp); } else if (c == '\n') { linecount++; current_lineno++; } } while ((unit == Bytes ? bytecount : linecount) < numberof); } skip_possible_newline(fp, outfp); string buf; if (!ps_get_line(buf, fp)) { error("missing %%%%EndData line"); return 0; } if (!matches_comment(buf, "EndData")) error("bad %%%%EndData line"); if (outfp) fputs(buf.contents(), outfp); return 0; }
/* (contains? FIELD STR) * * FIELD - string, name of field to match * (any, comment, description, summary, location) * STR - string, match string * * Returns a boolean indicating whether the specified field contains the * specified string. */ static ESExpResult * func_contains (ESExp *esexp, gint argc, ESExpResult **argv, gpointer data) { SearchContext *ctx = data; const gchar *field; const gchar *str; gboolean matches; ESExpResult *result; /* Check argument types */ if (argc != 2) { e_sexp_fatal_error ( esexp, _("\"%s\" expects two arguments"), "contains"); return NULL; } if (argv[0]->type != ESEXP_RES_STRING) { e_sexp_fatal_error ( esexp, _("\"%s\" expects the first " "argument to be a string"), "contains"); return NULL; } field = argv[0]->value.string; if (argv[1]->type != ESEXP_RES_STRING) { e_sexp_fatal_error ( esexp, _("\"%s\" expects the second " "argument to be a string"), "contains"); return NULL; } str = argv[1]->value.string; /* See if it matches */ if (strcmp (field, "any") == 0) matches = matches_any (ctx->comp, str); else if (strcmp (field, "comment") == 0) matches = matches_comment (ctx->comp, str); else if (strcmp (field, "description") == 0) matches = matches_description (ctx->comp, str); else if (strcmp (field, "summary") == 0) matches = matches_summary (ctx->comp, str); else if (strcmp (field, "location") == 0) matches = matches_location (ctx->comp, str); else if (strcmp (field, "attendee") == 0) matches = matches_attendee (ctx->comp, str); else if (strcmp (field, "organizer") == 0) matches = matches_organizer (ctx->comp, str); else if (strcmp (field, "classification") == 0) matches = matches_classification (ctx->comp, str); else if (strcmp (field, "status") == 0) matches = matches_status (ctx->comp, str); else if (strcmp (field, "priority") == 0) matches = matches_priority (ctx->comp, str); else { e_sexp_fatal_error ( esexp, _("\"%s\" expects the first " "argument to be either \"any\", " "\"summary\", or \"description\", or " "\"location\", or \"attendee\", or " "\"organizer\", or \"classification\""), "contains"); return NULL; } result = e_sexp_result_new (esexp, ESEXP_RES_BOOL); result->value.boolean = matches; return result; }