static void extract_quoted_files (char* pz_data, const char* pz_fixed_file, regmatch_t* p_re_match) { char *pz_dir_end = strrchr (pz_fixed_file, '/'); char *pz_incl_quot = pz_data; if (VLEVEL( VERB_APPLIES )) fprintf (stderr, "Quoted includes in %s\n", pz_fixed_file); /* Set "pz_fixed_file" to point to the containing subdirectory of the source If there is none, then it is in our current directory, ".". */ if (pz_dir_end == (char *) NULL) pz_fixed_file = "."; else *pz_dir_end = '\0'; for (;;) { pz_incl_quot += p_re_match->rm_so; /* Skip forward to the included file name */ while (*pz_incl_quot != '"') pz_incl_quot++; if (quoted_file_exists (pz_src_dir, pz_fixed_file, pz_incl_quot)) { /* Print the source directory and the subdirectory of the file in question. */ printf ("%s %s/", pz_src_dir, pz_fixed_file); pz_dir_end = pz_incl_quot; /* Append to the directory the relative path of the desired file */ while (*pz_incl_quot != '"') putc (*pz_incl_quot++, stdout); /* Now print the destination directory appended with the relative path of the desired file */ printf (" %s/%s/", pz_dest_dir, pz_fixed_file); while (*pz_dir_end != '"') putc (*pz_dir_end++, stdout); /* End of entry */ putc ('\n', stdout); } /* Find the next entry */ if (xregexec (&incl_quote_re, pz_incl_quot, 1, p_re_match, 0) != 0) break; } }
static int egrep_test (char* pz_data, tTestDesc* p_test) { #ifdef DEBUG if (p_test->p_test_regex == 0) fprintf (stderr, "fixincl ERROR RE not compiled: `%s'\n", p_test->pz_test_text); #endif if (xregexec (p_test->p_test_regex, pz_data, 0, 0, 0) == 0) return APPLY_FIX; return SKIP_FIX; }
static int parse_sup_line (void *ctx, char *line, char **query_str, tag_op_list_t *tag_ops) { regmatch_t match[3]; char *file_tags; int rerr; tag_op_list_reset (tag_ops); chomp_newline (line); /* Silently ignore blank lines */ if (line[0] == '\0') { return 1; } rerr = xregexec (®ex, line, 3, match, 0); if (rerr == REG_NOMATCH) { fprintf (stderr, "Warning: Ignoring invalid sup format line: %s\n", line); return 1; } *query_str = talloc_strndup_debug (ctx, line + match[1].rm_so, match[1].rm_eo - match[1].rm_so); file_tags = talloc_strndup_debug (ctx, line + match[2].rm_so, match[2].rm_eo - match[2].rm_so); char *tok = file_tags; size_t tok_len = 0; tag_op_list_reset (tag_ops); while ((tok = strtok_len (tok + tok_len, " ", &tok_len)) != NULL) { if (*(tok + tok_len) != '\0') { *(tok + tok_len) = '\0'; tok_len++; } if (tag_op_list_append (tag_ops, tok, FALSE)) return -1; } return 0; }
bool xregexec_substring(const regex_t *pref, char *string, int start, int end, size_t nmatch, regmatch_t *pmatch, int eflags) { bool rc; char tmp; tmp = string[end]; string[end] = '\0'; rc = xregexec(pref, string+start, nmatch, pmatch, eflags); string[end] = tmp; if (rc && start != 0) { for (; nmatch > 0; nmatch--) { pmatch[nmatch-1].rm_so += start; pmatch[nmatch-1].rm_eo += start; } } return rc; }
int notmuch_restore_command (unused (void *ctx), int argc, char *argv[]) { notmuch_config_t *config; notmuch_database_t *notmuch; notmuch_bool_t synchronize_flags; notmuch_bool_t accumulate = FALSE; char *input_file_name = NULL; FILE *input = stdin; char *line = NULL; size_t line_size; ssize_t line_len; regex_t regex; int rerr; int opt_index; config = notmuch_config_open (ctx, NULL, NULL); if (config == NULL) return 1; if (notmuch_database_open (notmuch_config_get_database_path (config), NOTMUCH_DATABASE_MODE_READ_WRITE, ¬much)) return 1; synchronize_flags = notmuch_config_get_maildir_synchronize_flags (config); notmuch_opt_desc_t options[] = { { NOTMUCH_OPT_POSITION, &input_file_name, 0, 0, 0 }, { NOTMUCH_OPT_BOOLEAN, &accumulate, "accumulate", 'a', 0 }, { 0, 0, 0, 0, 0 } }; opt_index = parse_arguments (argc, argv, options, 1); if (opt_index < 0) { /* diagnostics already printed */ return 1; } if (input_file_name) { input = fopen (input_file_name, "r"); if (input == NULL) { fprintf (stderr, "Error opening %s for reading: %s\n", input_file_name, strerror (errno)); return 1; } optind++; } if (opt_index < argc) { fprintf (stderr, "Cannot read dump from more than one file: %s\n", argv[optind]); return 1; } /* Dump output is one line per message. We match a sequence of * non-space characters for the message-id, then one or more * spaces, then a list of space-separated tags as a sequence of * characters within literal '(' and ')'. */ if ( xregcomp (®ex, "^([^ ]+) \\(([^)]*)\\)$", REG_EXTENDED) ) INTERNAL_ERROR("compile time constant regex failed."); while ((line_len = getline (&line, &line_size, input)) != -1) { regmatch_t match[3]; char *message_id, *file_tags; chomp_newline (line); rerr = xregexec (®ex, line, 3, match, 0); if (rerr == REG_NOMATCH) { fprintf (stderr, "Warning: Ignoring invalid input line: %s\n", line); continue; } message_id = xstrndup (line + match[1].rm_so, match[1].rm_eo - match[1].rm_so); file_tags = xstrndup (line + match[2].rm_so, match[2].rm_eo - match[2].rm_so); tag_message (notmuch, message_id, file_tags, !accumulate, synchronize_flags); free (message_id); free (file_tags); } regfree (®ex); if (line) free (line); notmuch_database_destroy (notmuch); if (input != stdin) fclose (input); return 0; }