diff options
Diffstat (limited to 'src/cr_main.c')
-rw-r--r-- | src/cr_main.c | 332 |
1 files changed, 181 insertions, 151 deletions
diff --git a/src/cr_main.c b/src/cr_main.c index 808f326..451e233 100644 --- a/src/cr_main.c +++ b/src/cr_main.c @@ -20,13 +20,14 @@ * * File : cr_main.c * - * @(#) [MB] cr_main.c Version 1.55 du 15/09/07 - + * @(#) [MB] cr_main.c Version 1.57 du 15/09/10 - * * Functions in this file : * ~~~~~~~~~~~~~~~~~~~~~~~~ * - cr_list2argv * - cr_lists2argv * - cr_read_config_file + * - cr_read_config_files * - cr_new_config * - cr_new_arg * - cr_new_args @@ -39,6 +40,7 @@ * - cr_getopt * - cr_set_args * - cr_add_to_list + * - cr_clear_marker_flags * - cr_add_regexp * - main * - cr_usage @@ -49,11 +51,13 @@ * - cr_add_config * - cr_add_arg * - cr_free_re + * - cr_marker2color + * - cr_set_desc * - cr_read_input * - cr_start_color * - cr_end_color * - cr_init_desc - * - cr_set_desc + * - cr_same_colors * - cr_disp_line * ============================================================================ */ @@ -124,9 +128,39 @@ void cr_lists2argv(struct cr_configs *configs) CR_READ_CONFIG_FILE ******************************************************************************/ -void cr_read_config_file() +void cr_read_config_file(char *cfg_file) +{ + if (access(cfg_file, 0) != 0) { +#if 0 + fprintf(stderr, "%s: config file \"%s\" does not exist !\n", + G.prgname, cfg_file); + exit(1); +#else + return; +#endif + } + + if ((yyin = fopen(cfg_file, "r")) == NULL) { + fprintf(stderr, "%s: cannot open \"%s\" !\n", + G.prgname, cfg_file); + perror("fopen"); + exit(1); + } + + yylex(); + +// cr_lists2argv(&G.configs); +} + +/****************************************************************************** + + CR_READ_CONFIG_FILES + +******************************************************************************/ +void cr_read_config_files(void) { - char *_home, _cfg_file[1024]; + int _size; + char *_home, *_cfg_file; if (G.config_file_read) { return; @@ -137,21 +171,17 @@ void cr_read_config_file() exit(1); } - sprintf(_cfg_file, "%s/%s", _home, CR_CONFIG_FILENAME); - if (access(_cfg_file, 0) != 0) { - fprintf(stderr, "%s: config file \"%s\" does not exist !\n", - G.prgname, _cfg_file); + _size = strlen(_home) + 1 + sizeof(CR_CONFIG_FILENAME); + if ((_cfg_file = malloc(_size)) == NULL) { + fprintf(stderr, cr_err_malloc, G.prgname); exit(1); } - if ((yyin = fopen(_cfg_file, "r")) == NULL) { - fprintf(stderr, "%s: cannot open \"%s\" !\n", - G.prgname, _cfg_file); - perror("fopen"); - exit(1); - } + sprintf(_cfg_file, "%s/%s", _home, CR_CONFIG_FILENAME); - yylex(); + cr_read_config_file(_cfg_file); + + cr_read_config_file(CR_DEFLT_CONFIG_FILE); cr_lists2argv(&G.configs); @@ -225,7 +255,7 @@ struct cr_config *cr_get_config(char *config_name, struct cr_args *args) struct cr_config *_config; if (!G.config_file_read) { - cr_read_config_file(); + cr_read_config_files(); } for (_config = args->configs->extract; _config != 0; @@ -461,7 +491,7 @@ void cr_add_to_list(struct cr_re_desc *re) /****************************************************************************** - CR_CLEAR_MARKER_FLAGS + CR_CLEAR_MARKER_FLAGS ******************************************************************************/ inline void cr_clear_marker_flags(void) @@ -496,7 +526,7 @@ void cr_add_regexp(int color, char *regexp) cr_add_to_list(_re); G.last_RE = _re; - G.last_color = color; + G.last_color = color; } else { _re = G.last_RE; @@ -511,7 +541,7 @@ void cr_add_regexp(int color, char *regexp) cr_clear_marker_flags(); G.last_RE = 0; - G.last_color = 0; + G.last_color = 0; } } @@ -550,7 +580,7 @@ int main(int argc, char *argv[]) break; case 'H': - cr_read_config_file(); + cr_read_config_files(); cr_usage(TRUE); break; @@ -643,7 +673,7 @@ int main(int argc, char *argv[]) break; case 'V': - fprintf(stderr, "%s: version %s\n", G.prgname, "1.55"); + fprintf(stderr, "%s: version %s\n", G.prgname, "1.57"); exit(1); break; @@ -690,13 +720,13 @@ int main(int argc, char *argv[]) cr_start_color(&_re->col); printf("%s", _re->regex[0]); cr_end_color(NULL); - printf("\n"); + printf("\n"); if (_re->regex[1]) { printf(" => "); cr_start_color(&_re->col); printf("%s", _re->regex[1]); cr_end_color(NULL); - printf("\n"); + printf("\n"); } } } @@ -714,7 +744,7 @@ int main(int argc, char *argv[]) ******************************************************************************/ void cr_usage(bool disp_config) { - fprintf(stderr, "%s: version %s\n", G.prgname, "1.55"); + fprintf(stderr, "%s: version %s\n", G.prgname, "1.57"); fprintf(stderr, "Usage: %s [-h|-H|-V|-[[%%.]eiuvdDEL1234][-[rgybmcwRGYBMCW] regexp ...][--config_name ...] ]\n", G.prgname); fprintf(stderr, " -h : help\n"); @@ -876,7 +906,7 @@ void cr_free_RE(void) /****************************************************************************** - CR_MARKER2COLOR + CR_MARKER2COLOR ******************************************************************************/ void cr_marker2color( struct cr_re_desc *re) @@ -884,48 +914,48 @@ void cr_marker2color( struct cr_re_desc *re) int _i = 0, _curr_level; struct cr_col_desc *_desc; - _curr_level = re->curr_level; + _curr_level = re->curr_level; //fprintf(stderr, "[%2d] >>> curr_level : %d\n", _i, _curr_level); for (_i = 0, _desc = G.desc; _i < G.length; _i++, _desc++) { - switch (_desc->marker) { - case 1: - _curr_level++; + switch (_desc->marker) { + case 1: + _curr_level++; //fprintf(stderr, "[%2d] +++ curr_level : %d\n", _i, _curr_level); - break; + break; - case -1: - if (_curr_level > 0) { - _curr_level--; - } + case -1: + if (_curr_level > 0) { + _curr_level--; + } //fprintf(stderr, "[%2d] --- curr_level : %d\n", _i, _curr_level); - break; + break; - case 0: + case 0: //fprintf(stderr, "[%2d] === curr_level : %d\n", _i, _curr_level); - break; - - default: - fprintf(stderr, "%s: internal error\n", G.prgname); - exit(1); - break; - } - if (!_desc->used) { - if (_curr_level > 0) { -// fprintf(stderr, "==> [%2d] [%c] Color set. Col num = %d\n", -// _i, G.line[_i], re->col.col_num); - _desc->used = TRUE; - _desc->col = &re->col; - } - else { -// fprintf(stderr, "==> [%2d] [%c] NO COLOR.\n", _i, G.line[_i]); - } - } - else { -// fprintf(stderr, "==> [%2d] [%c] Already colorized.\n", _i, G.line[_i]); - } - } - - re->curr_level = _curr_level; + break; + + default: + fprintf(stderr, "%s: internal error\n", G.prgname); + exit(1); + break; + } + if (!_desc->used) { + if (_curr_level > 0) { +// fprintf(stderr, "==> [%2d] [%c] Color set. Col num = %d\n", +// _i, G.line[_i], re->col.col_num); + _desc->used = TRUE; + _desc->col = &re->col; + } + else { +// fprintf(stderr, "==> [%2d] [%c] NO COLOR.\n", _i, G.line[_i]); + } + } + else { +// fprintf(stderr, "==> [%2d] [%c] Already colorized.\n", _i, G.line[_i]); + } + } + + re->curr_level = _curr_level; //fprintf(stderr, "[%2d] <<< curr_level : %d\n", _i, _curr_level); } @@ -940,35 +970,35 @@ void cr_set_desc(struct cr_re_desc *re, int offset, int s, int e, int marker) struct cr_col_desc *_desc; //fprintf(stderr, "SET_DESC : s = %3d e = %3d marker = %d\n", s, e, marker); - if (re->regex[1] == 0) { - /* RE descriptor does not define a range - ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */ - for (_i = s, _desc = &G.desc[offset + s]; _i <= e; _i++, _desc++) { - if (!_desc->used) { - _desc->used = TRUE; - _desc->col = &re->col; - } - } - } - else { - switch (marker) { - - case 1: - _desc = &G.desc[offset + s]; - break; - - case -1: - _desc = &G.desc[offset + e + 1]; // XXX : ATTENTION AU SEGV - break; - - default: - fprintf(stderr, "%s: erreur interne, marker = %d\n", - G.prgname, marker); - exit(1); - } - - _desc->marker = marker; - } + if (re->regex[1] == 0) { + /* RE descriptor does not define a range + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */ + for (_i = s, _desc = &G.desc[offset + s]; _i <= e; _i++, _desc++) { + if (!_desc->used) { + _desc->used = TRUE; + _desc->col = &re->col; + } + } + } + else { + switch (marker) { + + case 1: + _desc = &G.desc[offset + s]; + break; + + case -1: + _desc = &G.desc[offset + e + 1]; // XXX : ATTENTION AU SEGV + break; + + default: + fprintf(stderr, "%s: erreur interne, marker = %d\n", + G.prgname, marker); + exit(1); + } + + _desc->marker = marker; + } } /****************************************************************************** @@ -979,7 +1009,7 @@ void cr_set_desc(struct cr_re_desc *re, int offset, int s, int e, int marker) void cr_read_input(void) { int _i, _j, _n, _s = 0, _e = 0, _off, _idx_last, - _marker; + _marker; struct cr_re_desc *_re; size_t _nmatch; regmatch_t _pmatch[CR_SIZE + 1]; @@ -1010,58 +1040,58 @@ void cr_read_input(void) } for (_re = G.extract_RE; _re != NULL; _re = _re->next) { - for (_i = 0; _i < 2; _i++) { - if (_re->regex[_i]) { - for (_off = 0, _eflags = 0; - _off < G.length && - regexec(&_re->reg[_i], G.line + _off, _nmatch, _pmatch, - _eflags) == 0; _off += _e + 1, _eflags = REG_NOTBOL) { - - if (G.debug) { - fprintf(stderr, "Match for [%s] // [%s]\n", - G.line + _off, _re->regex[_i]); - fprintf(stderr, "LINE : [%s] :\n", G.line + _off); - } - - for (_j = 0; _pmatch[_j].rm_so != -1; _j++) { - if (_j == 0 && _pmatch[1].rm_so != -1) { - continue; - } - - _s = _pmatch[_j].rm_so; - _e = _pmatch[_j].rm_eo - 1; - - if (G.debug) { - strncpy(_debug_str, - G.line + _off + _s, _e - _s + 1); - _debug_str[_e -_s + 1] = 0; - fprintf(stderr, - "OFFSET = %3d : %3d => %3d [%s] [%s]\n", - _off, _s, _e, _re->regex[_i], _debug_str); - } - - if (_i == 0) _marker = 1; - else _marker = -1; - cr_set_desc(_re, _off, _s, _e, _marker); - } - - /* To handle empty strings - ~~~~~~~~~~~~~~~~~~~~~~~ */ - if (_e < 0) { - _e = 0; - } - } - - if (G.debug) { - fprintf(stderr, "NO MATCH for [%s] // [%s]\n", - G.line + _off, _re->regex[_i]); - } - } - } - - if (_re->regex[1]) { - cr_marker2color(_re); - } + for (_i = 0; _i < 2; _i++) { + if (_re->regex[_i]) { + for (_off = 0, _eflags = 0; + _off < G.length && + regexec(&_re->reg[_i], G.line + _off, _nmatch, _pmatch, + _eflags) == 0; _off += _e + 1, _eflags = REG_NOTBOL) { + + if (G.debug) { + fprintf(stderr, "Match for [%s] // [%s]\n", + G.line + _off, _re->regex[_i]); + fprintf(stderr, "LINE : [%s] :\n", G.line + _off); + } + + for (_j = 0; _pmatch[_j].rm_so != -1; _j++) { + if (_j == 0 && _pmatch[1].rm_so != -1) { + continue; + } + + _s = _pmatch[_j].rm_so; + _e = _pmatch[_j].rm_eo - 1; + + if (G.debug) { + strncpy(_debug_str, + G.line + _off + _s, _e - _s + 1); + _debug_str[_e -_s + 1] = 0; + fprintf(stderr, + "OFFSET = %3d : %3d => %3d [%s] [%s]\n", + _off, _s, _e, _re->regex[_i], _debug_str); + } + + if (_i == 0) _marker = 1; + else _marker = -1; + cr_set_desc(_re, _off, _s, _e, _marker); + } + + /* To handle empty strings + ~~~~~~~~~~~~~~~~~~~~~~~ */ + if (_e < 0) { + _e = 0; + } + } + + if (G.debug) { + fprintf(stderr, "NO MATCH for [%s] // [%s]\n", + G.line + _off, _re->regex[_i]); + } + } + } + + if (_re->regex[1]) { + cr_marker2color(_re); + } } cr_disp_line(); @@ -1170,19 +1200,19 @@ void cr_init_desc(void) _desc++) { _desc->col = NULL; _desc->used = FALSE; - _desc->marker = 0; + _desc->marker = 0; } } /****************************************************************************** - CR_SAME_COLORS + CR_SAME_COLORS ******************************************************************************/ inline bool cr_same_colors(struct cr_color *col1, struct cr_color *col2) { - return (col1->col_num == col2->col_num) - && (col1->intensity == col2->intensity); + return (col1->col_num == col2->col_num) + && (col1->intensity == col2->intensity); } /****************************************************************************** @@ -1201,7 +1231,7 @@ void cr_disp_line(void) if (G.curr_col) { cr_end_color(G.curr_col); putc('\n', G.curr_col->out); - G.curr_col = NULL; + G.curr_col = NULL; } else { putc('\n', stdout); @@ -1215,7 +1245,7 @@ void cr_disp_line(void) ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */ cr_start_color(_desc->col); putc(_c, _desc->col->out); - G.curr_col = _desc->col; + G.curr_col = _desc->col; } else { /* Previous character was in color @@ -1231,7 +1261,7 @@ void cr_disp_line(void) cr_end_color(G.curr_col); cr_start_color(_desc->col); putc(_c, _desc->col->out); - G.curr_col = _desc->col; + G.curr_col = _desc->col; } } } @@ -1243,7 +1273,7 @@ void cr_disp_line(void) ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */ cr_end_color(G.curr_col); putc(_c, G.curr_col->out); - G.curr_col = NULL; + G.curr_col = NULL; } else { /* Previous character was not in color @@ -1266,5 +1296,5 @@ void cr_disp_line(void) cr_end_color(G.curr_col); } - G.curr_col = NULL; + G.curr_col = NULL; } |