static void load_virt_ext(char *vname) { /* Our find_regexp() is geared to work on buffers rather than streams, so we'll create a stand-alone buffer. This also buys us proper handling of encodings. */ buffer * vb = alloc_buffer(NULL); if (vb == NULL) return; clear_buffer(vb); vb->opt.auto_prefs = 0; vb->opt.do_undo = 0; vb->opt.case_search = 0; if (load_file_in_buffer(vb, vname) != OK) return; bool skip_first = false; vb->find_string = "^\\s*(\\w+)\\s+([0-9]+i?)\\s+(.+[^ \\t])\\s*$|^\\.([^ \\t/]+)\\s*$"; vb->find_string_changed = 1; if ((virt_ext = realloc(virt_ext, (num_virt_ext + vb->num_lines) * sizeof *virt_ext)) && (extra_ext = realloc(extra_ext, (num_extra_exts + vb->num_lines) * sizeof *extra_ext))) { while (find_regexp(vb, NULL, skip_first, false) == OK) { skip_first = true; if (nth_regex_substring_nonempty(vb->cur_line_desc, 1)) { char * const ext = nth_regex_substring(vb->cur_line_desc, 1); char * const max_line_str = nth_regex_substring(vb->cur_line_desc, 2); char * const regex = nth_regex_substring(vb->cur_line_desc, 3); if (!ext || !max_line_str || !regex) break; errno = 0; char *endptr; int64_t max_line = strtoll(max_line_str, &endptr, 0); if (max_line < 1 || errno) max_line = INT64_MAX; int i; for(i = 0; i < num_virt_ext; i++) if (strcmp(virt_ext[i].ext, ext) == 0) { free(virt_ext[i].ext); free(virt_ext[i].regex); break; } virt_ext[i].ext = ext; virt_ext[i].max_line = max_line; virt_ext[i].regex = regex; virt_ext[i].case_sensitive = *endptr != 'i'; free(max_line_str); if (i == num_virt_ext) num_virt_ext++; } else { char * const ext = nth_regex_substring(vb->cur_line_desc, 4); if (! ext) break; int i; for(i = 0; i < num_extra_exts; i++) if (strcmp(extra_ext[i], ext) == 0) break; if (i == num_extra_exts) extra_ext[num_extra_exts++] = ext; else free(ext); } } } vb->find_string = NULL; /* Or free_buffer() would free() it. */ free_buffer(vb); }
static void init_history(void) { if (!history_buff){ history_buff = alloc_buffer(NULL); if (history_buff) { const char * const history_filename = tilde_expand("~/.ne/.history"); clear_buffer(history_buff); history_buff->opt.do_undo = 0; history_buff->opt.auto_prefs = 0; load_file_in_buffer(history_buff, history_filename); /* The history buffer is agnostic. The actual encoding of each line is detected dynamically. */ history_buff->encoding = ENC_8_BIT; change_filename(history_buff, str_dup(history_filename)); assert_buffer(history_buff); /* This should be never necessary with new histories, as all lines will be terminated by a life feed, but it is kept for backward compatibility. */ move_to_bof(history_buff); if (history_buff->cur_line_desc->line && history_buff->cur_line_desc->line_len) { insert_stream(history_buff, history_buff->cur_line_desc, history_buff->cur_line, history_buff->cur_line_desc->line_len, "", 1); } } } if (history_buff) { move_to_bof(history_buff); move_to_sol(history_buff); } }