#include <getopt.h>
#include <limits.h>
-#define VERSION "1.1.4"
+#define VERSION "1.1.5"
#define BUFFER_SIZE 4096
int case_sensitive = 0;
char *title = 0;
int error_flash = 0;
-int exclamation_negates = 0;
int upper_caps_makes_case_sensitive = 0;
int attr_modeline, attr_focus_line, attr_error;
void *safe_malloc(size_t n) {
void *p = malloc(n);
- if (!p && n != 0) {
- printf("Can not allocate memory: %s\n", strerror(errno));
+ if(!p && n != 0) {
+ fprintf(stderr,
+ "selector: can not allocate memory: %s\n", strerror(errno));
exit(EXIT_FAILURE);
}
return p;
fprintf(out, " -u, --upper-case-makes-case-sensitive\n");
fprintf(out, " using an upper case character in the matching string makes\n");
fprintf(out, " the matching case-sensitive\n");
- fprintf(out, " -n, --exclamation-negates\n");
- fprintf(out, " substrings starting with an exclamation mark have to be absent\n");
fprintf(out, " -m, --monochrome\n");
fprintf(out, " monochrome mode\n");
fprintf(out, " -q, --no-beep\n");
/* We came back to our original code, which means that the table
is full */
if(code == start) {
- printf("Full hash table (that should not happen)\n");
+ fprintf(stderr,
+ "Full hash table (that should not happen)\n");
exit(EXIT_FAILURE);
}
}
int n;
if(matcher->nb_patterns >= 0) {
if(matcher->case_sensitive) {
- if(exclamation_negates) {
- for(n = 0; n < matcher->nb_patterns; n++) {
- if(matcher->patterns[n][0] == '!') {
- if(strstr(string, matcher->patterns[n] + 1) != 0) return 0;
- } else {
- if(strstr(string, matcher->patterns[n]) == 0) return 0;
- }
- }
- } else {
- for(n = 0; n < matcher->nb_patterns; n++) {
- if(strstr(string, matcher->patterns[n]) == 0) return 0;
- }
+ for(n = 0; n < matcher->nb_patterns; n++) {
+ if(strstr(string, matcher->patterns[n]) == 0) return 0;
}
} else {
- if(exclamation_negates) {
- for(n = 0; n < matcher->nb_patterns; n++) {
- if(matcher->patterns[n][0] == '!') {
- if(strcasestr(string, matcher->patterns[n] + 1) != 0) return 0;
- } else {
- if(strcasestr(string, matcher->patterns[n]) == 0) return 0;
- }
- }
- } else {
- for(n = 0; n < matcher->nb_patterns; n++) {
- if(strcasestr(string, matcher->patterns[n]) == 0) return 0;
- }
+ for(n = 0; n < matcher->nb_patterns; n++) {
+ if(strcasestr(string, matcher->patterns[n]) == 0) return 0;
}
}
return 1;
int nb_lines_max, int *nb_lines, char **lines) {
char raw_line[BUFFER_SIZE];
- int start, end, eol, k;
+ char *s;
FILE *file;
file = fopen(input_filename, "r");
exit(EXIT_FAILURE);
}
- start = 0;
- end = 0;
-
- while(*nb_lines < nb_lines_max && (end > start || !feof(file))) {
- eol = start;
-
- /* Look for the end of a line in what is already in the buffer */
- while(eol < end && raw_line[eol] != '\n') eol++;
-
- /* if we did not find the of a line, move what has not been
- processed and is in the buffer to the beginning of the buffer,
- fill the buffer with new data from the file, and look for the
- end of a line */
- if(eol == end) {
- for(k = 0; k < end - start; k++) {
- raw_line[k] = raw_line[k + start];
- }
- end -= start;
- eol -= start;
- start = 0;
- end += fread(raw_line + end, sizeof(char), BUFFER_SIZE - end, file);
- while(eol < end && raw_line[eol] != '\n') eol++;
- }
-
- /* The end of the line is the buffer size, which means the line is
- too long */
-
- if(eol == BUFFER_SIZE) {
- raw_line[BUFFER_SIZE - 1] = '\0';
- fprintf(stderr, "selector: Line too long (max is %d characters):\n",
- BUFFER_SIZE);
- fprintf(stderr, "%s", raw_line);
- fprintf(stderr, "\n");
- exit(EXIT_FAILURE);
+ while(*nb_lines < nb_lines_max && fgets(raw_line, BUFFER_SIZE, file)) {
+ for(s = raw_line + strlen(raw_line) - 1; s > raw_line && *s == '\n'; s--) {
+ *s = '\0';
}
-
- /* If we got a line, we replace the carriage return by a \0 to
- finish the string */
-
- raw_line[eol] = '\0';
-
- store_line(hash_table, raw_line + start,
- nb_lines, lines);
-
- start = eol + 1;
+ store_line(hash_table, raw_line, nb_lines, lines);
}
fclose(file);
upper_caps_makes_case_sensitive = 1;
break;
- case 'n':
- exclamation_negates = 1;
- break;
-
case 't':
free(title);
title = safe_malloc((strlen(optarg) + 1) * sizeof(char));
/* Here we come back to standard display */
- if((key == KEY_ENTER || key == '\n')) {
+ if(key == KEY_ENTER || key == '\n') {
char *t;