diff options
author | mbornet-hl <mbornet.pro@wanadoo.fr> | 2015-07-09 23:37:34 +0200 |
---|---|---|
committer | mbornet-hl <mbornet.pro@wanadoo.fr> | 2015-07-09 23:37:34 +0200 |
commit | b9f1a1491484178af5625a485363c5fc055597c0 (patch) | |
tree | 98f07192c2913b1c41924829d88c5a52bc1294ac | |
parent | a6ab43061a6dee2502257bcb3ae550c0e68c8e33 (diff) | |
download | hl-b9f1a1491484178af5625a485363c5fc055597c0.zip hl-b9f1a1491484178af5625a485363c5fc055597c0.tar.gz hl-b9f1a1491484178af5625a485363c5fc055597c0.tar.bz2 |
hl can now use a configuration file.
-rw-r--r-- | src/.hl.cfg | 156 | ||||
-rw-r--r-- | src/Makefile | 6 | ||||
-rw-r--r-- | src/cr_cpri.h | 88 | ||||
-rw-r--r-- | src/cr_epri.h | 18 | ||||
-rw-r--r-- | src/cr_gpri.c | 5 | ||||
-rw-r--r-- | src/cr_lex.l | 130 | ||||
-rw-r--r-- | src/cr_main.c | 548 | ||||
-rw-r--r-- | src/cr_makefile | 57 | ||||
-rwxr-xr-x | src/hl | bin | 15120 -> 31800 bytes |
9 files changed, 933 insertions, 75 deletions
diff --git a/src/.hl.cfg b/src/.hl.cfg new file mode 100644 index 0000000..6f42620 --- /dev/null +++ b/src/.hl.cfg @@ -0,0 +1,156 @@ +# +# @(#) [MB] cr_.hl.cfg Version 1.3 du 15/07/09 - +# + +apt : + -ei + -r 'systemd|breaks?|.*\<unmet\>.*|.*\<unable\>.*' + -y '.*is not going.*' + -c '.*is to be .*' + -g '.*is already the newest.*' + +cal : + -e + -g '[1-9][0-9][0-9][0-9]' + -y 'January|February|March|April|May|June|July|August|September|October|November|December' + -c 'Su|Mo|Tu|We|Th|Fr|Sa' + -b '[0-9]' + +df : + -e + -r '\<((100|9[5-9])%.*)' + -y '\<((8[0-9]|9[0-4])%.*)' + -c '\<[0-4][0-9]?%.*' + -g '\<[0-9]+%.*' + -b '^Filesystem.*' + +diff : + -e + -y '^<.*' + -g '^>.*' + -c '^([0-9]+(,[0-9]+)?[a-z][0-9]+(,[0-9]+)?)' + +err : + -ei + -r '.*error.*' + -y '.*warn.*' +# -c '[[:alpha:]][[:alnum:]]]?_[[:alnum:]]+\.[cly]' +# -m '[[:alpha:]][[:alnum:]]]?_[[:alnum:]]+\.o' +# -b '^----- .*|^ {8}.*' + +ethtool : + -ei + -r 'duplex:.*half|link detected:.*no|speed:.*100?Mb/s' + -g 'duplex:.*full|link detected:.*yes|speed:.*1000mb/s' + +heartbeat : + -ei + -r '(stop(|ped)|error|fail\>|failed|dead|disabled?|\<down|\<no\>)' + -g '(success|running|start(ed|ing)?|OK|yes|shutdown complete)' + -y 'warn' + -W '(eth[0-9](\.[0-9]+)?(:[0-9]+))' + -b 'info' + +hl : + -i + -R '.*\<red\>.*reverse video.*' + -G '.*\<green\>.*reverse video.*' + -Y '.*\<yellow\>.*reverse video.*' + -B '.*\<blue\>.*reverse video.*' + -M '.*\<magenta\>.*reverse video.*' + -C '.*\<cyan\>.*reverse video.*' + -W '.*\<white\>.*reverse video.*' + -r '.*\<red\>.*' + -g '.*\<green\>.*' + -y '.*\<yellow\>.*' + -b '.*\<blue\>.*' + -m '.*\<magenta\>.*' + -c '.*\<cyan\>.*' + -w '.*\<white\>.*' + +ifconfig : + -ei + -m '^((eth|(vir)?br|vnet)[0-9.]*:[0-9]+)\>' + -b '^((eth|(vir)?br|vnet)[0-9.]*\.[0-9]+)\>' + -c '(([0-9a-f]{2}:){5}[0-9a-f]{2})' + -g '(\<UP\>|\<RUNNING\>|([0-9]{1,3}\.){3}[0-9]{1,3}\>)' + -y '(^(eth|(vir)?br|vnet)[0-9.:]*)\>' + -W '[0-9a-f]{4}::[0-9a-f]{4}\:[0-9a-f]{4}:[0-9a-f]{4}:[0-9a-f]{4}' + -r ' ((errors|dropped|overruns):[^0][0-9]*)' + +iptables : + -e + -c 'INPUT' + -y 'FORWARD|POSTROUTING' + -b '#.*' + -W 'OUTPUT' + -g '.*ACCEPT.*' + -r '(.*(DROP|REJECT).*)' + -m 'iptables.*-F.*' + -w '^iptables .*' + +ls_doc : + -e -r '^-rw........*' + -g '^-r-........*' + -m '^d..........*.*' + -y '.*:$' + +MAC : + -ei + -c '(([0-9a-f]{2}:){5}[0-9a-f]{2})' + +percent : + -e + -r '\<(100|9[5-9])%' + -y '\<(8[0-9]|9[0-4])%' + -g '\<[0-9]+%' + +ps_cpu : + -e +# -C '/home/machine/[^ ]+\.img' + -r '((0[1-9]|[1-9][0-9]):[0-9]{2}:[0-9]{2} .*)' + -y '(00:(0[1-9]|[1-9][0-9]):[0-9]{2} .*)' + -g '00:00:[1-9][0-9] .*' + -c '00:00:0[1-9] .*' + -b '00:00:00 .*' + +services : + -e + -g '^ *\[ \+ \] .*' -m '^ *\[ - \] .*' -r '^ *\[ \? \] .*' + +validate_IP : + -e + -g '\<((([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\.){3}([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5]))\>' + -r '[0-9]' + +virsh_list : + -e + -c '^ *Id.*|^--*' + -g '.*running*' + -m '.*shut off' + -y '.*paused' + +xxd : + -e + -r '(\<0a)|(0a\>)' + -b '^[^:]+' + -g '.{16}$' + -c '[[:xdigit:]]' + +za_conf : + -ei + -b '[ ]*#.*' + -g '^[-_.[:alnum:]]+[ ]*:|-C[ ]+[-_.[:alnum:]]+' + -C '<db::' + -c '[-[:alnum:]]+:[^ ]+' + -m '[ ](-[-_[:alnum:]]+|--[-_[:alnum:]]+)' + -r '-M[ ]+(fs|users|rpm|dpkg|sysconf)' + -y '(-o|--html-out)[ ]+[^ ]+' + -w '(--title|--label)[ ]+[^ ]+' + +za0 : + -e + -r '.* 0$' + -g '.' + + diff --git a/src/Makefile b/src/Makefile index 8aa89e4..715dbd3 100644 --- a/src/Makefile +++ b/src/Makefile @@ -2,7 +2,7 @@ # Makefile # -hl : cr_main.o cr_gpri.o - @ $(CC) -o hl cr_main.o cr_gpri.o +hl : cr_main.o cr_gpri.o cr_lex.o + @ $(CC) -o hl cr_main.o cr_gpri.o cr_lex.o @ strip hl - -@ ./hl -v || : + -@ ./hl -V || : diff --git a/src/cr_cpri.h b/src/cr_cpri.h index 7b6731e..20538ea 100644 --- a/src/cr_cpri.h +++ b/src/cr_cpri.h @@ -22,7 +22,7 @@ * * Fichier : cr_cpri.h * - * @(#) cr_cpri.h 1.12 15/05/31 MB + * @(#) cr_cpri.h 1.15 15/07/08 MB * * ============================================================================ */ @@ -34,13 +34,15 @@ #include <sys/types.h> #include <regex.h> +#define CR_CONFIG_FILENAME ".hl.cfg" + #define bool int #define FALSE (0) #define TRUE (1) #define CR_NB_COLORS (16) -#define CR_DEFLT_INTENSITY (2) +#define CR_DEFLT_INTENSITY (2) /* Numeros des couleurs * ~~~~~~~~~~~~~~~~~~~~ */ @@ -85,16 +87,37 @@ * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */ #define CR_COLOR_IDX(color) ((color)) -#if 0 -/* Code des couleurs pour Linux ANSI - ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */ -#define CR_CODE_LINUX(color) ((color) % 8) + 30) -#endif - /* Taille d'une ligne, nombre d'intervalles differents * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */ #define CR_SIZE (1024) +//#define CR_DISP_LEX(...) fprintf(stderr, __VA_ARGS__) +#define CR_DISP_LEX(...) + +#define CR_NEW(name) \ +struct cr_##name *cr_new_##name(void) \ +{ \ + struct cr_##name *_##name; \ + \ + if ((_##name = (struct cr_##name *) malloc(sizeof(*_##name))) == 0) { \ + fprintf(stderr, cr_err_malloc, G.prgname); \ + exit(1); \ + } \ + bzero(_##name, sizeof(*_##name)); \ + \ + return _##name; \ +} +#define CR_DECL_NEW(name) struct cr_##name *cr_new_##name(void) + +#if ! defined(yyin) +//#define yyin CR_in +#endif +#if ! defined(yylex) +#define yylex CR_lex +#endif + +/* Structures + ~~~~~~~~~~ */ struct cr_RE { regex_t reg; char *regex; @@ -115,6 +138,44 @@ struct cr_col_desc { struct cr_color *col; }; +struct cr_arg { + char *value; + struct cr_arg *next; +}; + +struct cr_config { + char *name; + bool visited; + struct cr_config *next; + struct cr_arg *extract, + *insert; + int argc; + char **argv; +}; + +struct cr_configs { + struct cr_config *extract, + *insert; +}; + +struct cr_ptrs { + int argc; + char **argv; + char **curr_argv; + char *curr_arg; + int curr_idx; + char *next_arg; + struct cr_ptrs *prev; + struct cr_config *config; +}; + +struct cr_args { + char *opts; + char *optarg; + struct cr_ptrs *curr_ptrs; + struct cr_configs *configs; +}; + struct cr_global { char *prgname; @@ -126,11 +187,14 @@ struct cr_global { char line[CR_SIZE + 1]; struct cr_col_desc desc[CR_SIZE + 1]; int length; - bool debug; - bool disp_regex; + bool debug, + verbose, + disp_regex, + config_file_read; FILE *out; - bool newline; - int intensity; + bool newline; + int intensity; + struct cr_configs configs; }; #endif /* CR_CPRI_H */ diff --git a/src/cr_epri.h b/src/cr_epri.h index eee4a52..f2d508c 100644 --- a/src/cr_epri.h +++ b/src/cr_epri.h @@ -22,7 +22,7 @@ * * Fichier : cr_epri.h * - * @(#) cr_epri.h 1.8 15/03/24 MB + * @(#) cr_epri.h 1.11 15/07/08 MB * * ============================================================================ */ @@ -34,11 +34,23 @@ extern struct cr_global G; +extern FILE *yyin; + +/* Error messages + ~~~~~~~~~~~~~~ */ +extern char *cr_err_malloc; + /* Fonctions * ~~~~~~~~~ */ -void cr_usage(void); +void cr_usage(bool); +void cr_display_args(struct cr_config *); +void cr_display_config(void); void cr_init_list(void); void cr_init_col_names(void); +CR_DECL_NEW(config); +CR_DECL_NEW(arg); +void cr_add_config(struct cr_config *); +void cr_add_arg(struct cr_arg *); void cr_set_color(int, char *); void cr_free_RE(void); void cr_read_input(void); @@ -49,4 +61,6 @@ void cr_init_desc(void); void cr_set_desc(struct cr_color *, int, int, int); void cr_disp_line(void); +int yylex(void); + #endif /* CR_EPRI_H */ diff --git a/src/cr_gpri.c b/src/cr_gpri.c index c68691d..148494e 100644 --- a/src/cr_gpri.c +++ b/src/cr_gpri.c @@ -22,7 +22,7 @@ * * Fichier : cr_gpri.c * - * @(#) cr_gpri.c 1.4 15/03/24 MB + * @(#) cr_gpri.c 1.5 15/07/01 MB * * ============================================================================ */ @@ -31,3 +31,6 @@ struct cr_global G = { 0 }; +/* Error messages + ~~~~~~~~~~~~~~ */ +char *cr_err_malloc = "%s: cannot allocate memory !\n"; diff --git a/src/cr_lex.l b/src/cr_lex.l new file mode 100644 index 0000000..453874d --- /dev/null +++ b/src/cr_lex.l @@ -0,0 +1,130 @@ +%{ +/* ============================================================================ + * (C) Copyright Martial Bornet, 2015. + * + * Auteur : Martial BORNET (MB) - 17 Juin 2015 + * + * Description : Analyseur lexical + * + * Fichier : cr_lex.l + * + * @(#) cr_lex.l 1.2 15/07/08 MB + * + * ============================================================================ + */ + +#include <string.h> +#include "cr_epri.h" + +%} + +config ([a-zA-Z][-._a-zA-Z0-9]*) +options (-[a-zA-Z0-9]+) +args ('.*') +space ([ \t]+) +call_config (--[a-zA-Z0-9]+) +sep (:) + +%s CONFIG ARGS + +%% + +^#.* { + CR_DISP_LEX("COMMENT : %s\n", yytext); + } + +{config} { + struct cr_config *_config; + + BEGIN CONFIG; + CR_DISP_LEX("CONFIG : %s\n", yytext); + + _config = cr_new_config(); + _config->name = strdup(yytext); + + cr_add_config(_config); + } + +<CONFIG>{sep}$ { + BEGIN ARGS; + CR_DISP_LEX("SEP\n"); + } + +<CONFIG>{sep}{space}$ { + BEGIN ARGS; + CR_DISP_LEX("Espaces apres separateur !\n"); + } + +<ARGS>{call_config} { + struct cr_arg *_arg; + + CR_DISP_LEX("CFG : [%s]\n", yytext); + _arg = cr_new_arg(); + _arg->value = strdup(yytext); + + cr_add_arg(_arg); + } + +<ARGS>{options} { + struct cr_arg *_arg; + + CR_DISP_LEX("OPTIONS : [%s]\n", yytext); + _arg = cr_new_arg(); + _arg->value = strdup(yytext); + + cr_add_arg(_arg); + } + +<ARGS>{args} { + struct cr_arg *_arg; + int _l; + + CR_DISP_LEX("ARGS : [%s]\n", yytext); + _l = strlen(yytext); + yytext[_l - 1] = 0; + _arg = cr_new_arg(); + _arg->value = strdup(yytext + 1); + + cr_add_arg(_arg); + } + +<ARGS>^[ \t]*\n { + BEGIN 0; + } + +.|\n ; + +%% + +#if 0 +/****************************************************************************** + + MAIN + +******************************************************************************/ +int main() +{ + yylex(); + return 0; +} +#endif + +/****************************************************************************** + + YYWRAP + +******************************************************************************/ +int yywrap() +{ + return 1; +} + +/****************************************************************************** + + YYERROR + +******************************************************************************/ +void yyerror(char *message) +{ + fprintf(stderr, "%s\n", message); +} diff --git a/src/cr_main.c b/src/cr_main.c index f4e45b3..bcc934b 100644 --- a/src/cr_main.c +++ b/src/cr_main.c @@ -20,10 +20,11 @@ * * Fichier : cr_main.c * - * @(#) cr_main.c 1.30 15/06/07 MB + * @(#) cr_main.c 1.35 15/07/09 MB * * Liste des fonctions de ce fichier : * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + * - cr_read_config_file * - main * - cr_usage * - cr_init_list @@ -43,6 +44,8 @@ #include <unistd.h> #include <getopt.h> #include <string.h> +#include <strings.h> +#include <assert.h> #include "cr_epri.h" @@ -50,6 +53,381 @@ /****************************************************************************** + CR_LIST2ARGV + +******************************************************************************/ +void cr_list2argv(struct cr_config *config) +{ + char **_argv; + struct cr_arg *_arg, *_old_arg; + int _size; + + _size = sizeof(char **) * (config->argc + 2); + + config->argv = (char **) malloc(_size); + if (config->argv == 0) { + fprintf(stderr, cr_err_malloc, G.prgname); + exit(1); + } + bzero(config->argv, _size); + + for (_argv = config->argv + 1, _arg = config->extract; _arg != 0; ) { + *_argv++ = _arg->value; + _old_arg = _arg; + _arg = _arg->next; + free(_old_arg); + } + + *_argv = 0; + config->extract = + config->insert = 0; +} + +/****************************************************************************** + + CR_LISTS2ARGV + +******************************************************************************/ +void cr_lists2argv(struct cr_configs *configs) +{ + struct cr_config *_config; + + for (_config = configs->extract; _config != 0; _config = _config->next) { + cr_list2argv(_config); + } +} + +/****************************************************************************** + + CR_READ_CONFIG_FILE + +******************************************************************************/ +void cr_read_config_file(bool *already_done) +{ + char *_home, _cfg_file[1024]; + + if (*already_done == TRUE) { + return; + } + + if ((_home = getenv("HOME")) == 0) { + fprintf(stderr, "%s: HOME variable undefined !\n", G.prgname); + 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); + exit(1); + } + + 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); + + *already_done = TRUE; +} + +/****************************************************************************** + + CR_NEW_CONFIG + +******************************************************************************/ +CR_NEW(config) + +/****************************************************************************** + + CR_NEW_ARG + +******************************************************************************/ +CR_NEW(arg) + +/****************************************************************************** + + CR_NEW_ARGS + +******************************************************************************/ +CR_NEW(args) + +/****************************************************************************** + + CR_NEW_PTRS + +******************************************************************************/ +CR_NEW(ptrs) + +/****************************************************************************** + + CR_NEEDS_ARG + +******************************************************************************/ +bool cr_needs_arg(char opt, struct cr_args *args) +{ + int _i; + +//printf("needs_args(%c, %s) ...\n", opt, args->opts); + for (_i = 0; args->opts[_i] != 0; _i++) { + if (args->opts[_i] != opt) continue; + if (args->opts[_i + 1] == ':') { +// printf(" => YES\n"); + return TRUE; + } + else { + break; + } + } + +// printf(" => NO\n"); + return FALSE; +} + +/****************************************************************************** + + CR_GET_CONFIG + +******************************************************************************/ +struct cr_config *cr_get_config(char *config_name, struct cr_args *args) +{ + struct cr_config *_config; + + for (_config = args->configs->extract; _config != 0; + _config = _config->next) { + if (!strcmp(config_name, _config->name)) { +// fprintf(stderr, "Config found !\n"); + break; + } + } + + return _config; +} + +/****************************************************************************** + + CR_DUMP_PTRS + +******************************************************************************/ +void cr_dump_ptrs(struct cr_ptrs *ptrs) +{ + printf("PTRS :\n"); + printf(" curr_arg = \"%s\"\n", ptrs->curr_arg); + printf(" curr_idx = %d\n", ptrs->curr_idx); + printf(" next_arg = \"%s\"\n", ptrs->next_arg); + printf(" prev = %p\n", ptrs->prev); + printf(" config = %p\n", ptrs->config); +} + +/****************************************************************************** + + CR_DUMP_ARGS + +******************************************************************************/ +void cr_dump_args(struct cr_args *args) +{ + printf("ARGS :\n"); + printf(" opts = \"%s\"\n", args->opts); + printf(" optarg = \"%s\"\n", args->optarg); + printf(" curr_ptrs = %p\n", args->curr_ptrs); + + cr_dump_ptrs(args->curr_ptrs); +} + +/****************************************************************************** + + CR_GETOPT + +******************************************************************************/ +int cr_getopt(struct cr_args *args) +{ + /* Les pointeurs sont toujours positionnes sur + * l'argument / option a traiter + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */ + char _c, *_arg, *_config_name, _next_char; + struct cr_ptrs *_ptrs, *_new_ptrs; + struct cr_config *_config; + + for ( ; ; ) { + if (!(_ptrs = args->curr_ptrs)) { + /* Plus d'arguments a traiter + ~~~~~~~~~~~~~~~~~~~~~~~~~~ */ +//fprintf(stderr, "NO MORE ARGS.\n"); + return -1; + } +//X + if (*(_ptrs->curr_argv) == 0) { + /* Plus d'argument pour ce niveau + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */ +//fprintf(stderr, "No more args for this level\n"); + args->curr_ptrs = _ptrs->prev; + free(_ptrs); + continue; + } + +//fprintf(stderr, "Current arg = %p \"%s\"\n", _ptrs->curr_arg, _ptrs->curr_arg); + +//fprintf(stderr, "curr_idx = %d\n", _ptrs->curr_idx); + if (_ptrs->curr_idx == 0) { +//X + /* Traitement d'un nouvel argument + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */ + if (_ptrs->curr_arg[0] != '-') { + fprintf(stderr, "%s: argument with no associated option (\"%s\") ! \n", + G.prgname, _ptrs->curr_arg); + cr_dump_args(args); + exit(1); + } + else { + /* Suite du traitement d'un argument + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */ + _ptrs->curr_idx++; + if (_ptrs->curr_arg[1] != '-') { + /* Suite des options a une lettre + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */ + break; + } + else { + /* Nom de configuration + ~~~~~~~~~~~~~~~~~~~~ */ +//X + _config_name = _ptrs->curr_arg + 2; +//fprintf(stderr, "CONFIG : \"%s\"\n", _config_name); + _ptrs->curr_argv++; +//X + _ptrs->curr_arg = *_ptrs->curr_argv; +//X +//fprintf(stderr, "Apres incrementation pointeur CONFIG :\n"); +//fprintf(stderr, "Current arg = %p \"%s\"\n", _ptrs->curr_arg, _ptrs->curr_arg); + + _config = cr_get_config(_config_name, args); + if (_config == 0) { + fprintf(stderr, "%s: undefined configuration (%s) !\n", + G.prgname, _config_name); + exit(1); + } + +//X + /* Recherche de boucle recursive + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */ + if (_config->visited) { + fprintf(stderr, "%s: configuration loop for \"%s\" !\n", + G.prgname, _config->name); + exit(1); + } + _config->visited = TRUE; + + _new_ptrs = cr_new_ptrs(); + _new_ptrs->prev = args->curr_ptrs; + _new_ptrs->argc = _config->argc; + _new_ptrs->argv = _config->argv; + _new_ptrs->curr_argv = _new_ptrs->argv + 1; + _new_ptrs->curr_arg = _new_ptrs->argv[1]; + _new_ptrs->config = _config; // Utilite ??? + args->curr_ptrs = _new_ptrs; + +//X + continue; + } + } + } + else { +//X + break; + } + } +//X + + /* Options + ~~~~~~~ */ +//X + _c = _ptrs->curr_arg[_ptrs->curr_idx]; +//X +//fprintf(stderr, "OPTION : %c\n", _c); + _ptrs->curr_idx++; + _next_char = _ptrs->curr_arg[_ptrs->curr_idx]; + if (cr_needs_arg(_c, args)) { +//fprintf(stderr, " argument needed.\n"); + _arg = *(_ptrs->curr_argv + 1); + if (_arg[0] == '-' || _next_char != 0) { + fprintf(stderr, "%s: missing argument for \"-%c\" !\n", + G.prgname, _c); + cr_dump_args(args); + exit(1); + } +//X + + args->optarg = _arg; +//fprintf(stderr, " OPTARG = \"%s\"\n", args->optarg); + _ptrs->curr_argv++; + _ptrs->curr_arg = *_ptrs->curr_argv; + } + else { +//fprintf(stderr, " no argument needed.\n"); + args->optarg = 0; + } + +//X + if (_next_char == 0) { +//fprintf(stderr, " no more 1 letter option\n"); +//X +//fprintf(stderr, "Current arg = %p \"%s\"\n", _ptrs->curr_arg, _ptrs->curr_arg); + if (*(_ptrs->curr_argv + 1) == 0) { + /* Plus d'argument pour ce niveau + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */ +//fprintf(stderr, "No more args for this level\n"); + args->curr_ptrs = _ptrs->prev; + free(_ptrs); + } + else { + _ptrs->curr_argv++; + _ptrs->curr_arg = *_ptrs->curr_argv; + _ptrs->curr_idx = 0; +//fprintf(stderr, " Next arg = %p \"%s\"\n", _ptrs->curr_arg, _ptrs->curr_arg); + } + } +//X + return _c; +} + +/****************************************************************************** + + CR_SET_ARGS + +******************************************************************************/ +struct cr_args *cr_set_args(int argc, char **argv, char *opts, + struct cr_configs *configs) +{ + struct cr_args *_args; + struct cr_ptrs *_ptrs; + + _args = cr_new_args(); + _ptrs = cr_new_ptrs(); + + _ptrs->argc = argc; + _ptrs->argv = argv + 1; + _ptrs->curr_argv = _ptrs->argv; + _ptrs->curr_arg = argv[1]; + _ptrs->curr_idx = 0; + _ptrs->next_arg = NULL; + _ptrs->prev = NULL; + _ptrs->config = NULL; + + _args->opts = opts; + _args->optarg = NULL; + _args->curr_ptrs = _ptrs; + _args->configs = configs; + + return _args; +} + +/****************************************************************************** + MAIN ******************************************************************************/ @@ -57,24 +435,42 @@ int main(int argc, char *argv[]) { int _opt, _i; struct cr_color *_col; + struct cr_args *_args; G.prgname = argv[0]; G.out = stdout; if (argc == 1) { - cr_usage(); + cr_usage(FALSE); } cr_init_list(); cr_init_col_names(); G.intensity = CR_DEFLT_INTENSITY; + /* Scan des arguments a la recherche d'une configuration (--...) + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */ + for (_i = 1; _i < argc; _i++) { + if (argv[_i][0] == '-' && argv[_i][1] == '-' && argv[_i][2] != 0) { + cr_read_config_file(&G.config_file_read); + break; + } + } + /* Analyse des arguments ~~~~~~~~~~~~~~~~~~~~~ */ - while ((_opt = getopt(argc, argv, "huvEr:g:y:b:m:c:w:R:G:Y:B:M:C:W:Ddei1234")) != -1) { + _args = cr_set_args(argc, argv, + "hHuVvEr:g:y:b:m:c:w:R:G:Y:B:M:C:W:Ddei1234", + &G.configs); + while ((_opt = cr_getopt(_args)) != -1) { switch (_opt) { case 'h': - cr_usage(); + cr_usage(FALSE); + break; + + case 'H': + cr_read_config_file(&G.config_file_read); + cr_usage(TRUE); break; case 'E': @@ -90,59 +486,59 @@ int main(int argc, char *argv[]) break; case 'r': - cr_set_color(CR_RED, optarg); + cr_set_color(CR_RED, _args->optarg); break; case 'g': - cr_set_color(CR_GREEN, optarg); + cr_set_color(CR_GREEN, _args->optarg); break; case 'y': - cr_set_color(CR_YELLOW, optarg); + cr_set_color(CR_YELLOW, _args->optarg); break; case 'b': - cr_set_color(CR_BLUE, optarg); + cr_set_color(CR_BLUE, _args->optarg); break; case 'm': - cr_set_color(CR_MAGENTA, optarg); + cr_set_color(CR_MAGENTA, _args->optarg); break; case 'c': - cr_set_color(CR_CYAN, optarg); + cr_set_color(CR_CYAN, _args->optarg); break; case 'w': - cr_set_color(CR_WHITE, optarg); + cr_set_color(CR_WHITE, _args->optarg); break; case 'R': - cr_set_color(CR_RED_REV, optarg); + cr_set_color(CR_RED_REV, _args->optarg); break; case 'G': - cr_set_color(CR_GREEN_REV, optarg); + cr_set_color(CR_GREEN_REV, _args->optarg); break; case 'Y': - cr_set_color(CR_YELLOW_REV, optarg); + cr_set_color(CR_YELLOW_REV, _args->optarg); break; case 'B': - cr_set_color(CR_BLUE_REV, optarg); + cr_set_color(CR_BLUE_REV, _args->optarg); break; case 'M': - cr_set_color(CR_MAGENTA_REV, optarg); + cr_set_color(CR_MAGENTA_REV, _args->optarg); break; case 'C': - cr_set_color(CR_CYAN_REV, optarg); + cr_set_color(CR_CYAN_REV, _args->optarg); break; case 'W': - cr_set_color(CR_WHITE_REV, optarg); + cr_set_color(CR_WHITE_REV, _args->optarg); break; case 'e': @@ -158,7 +554,11 @@ int main(int argc, char *argv[]) break; case 'v': - fprintf(stderr, "%s: version %s\n", G.prgname, "1.30"); + G.verbose = TRUE; + break; + + case 'V': + fprintf(stderr, "%s: version %s\n", G.prgname, "1.35"); exit(1); break; @@ -171,7 +571,7 @@ int main(int argc, char *argv[]) default: fprintf(stderr, "%s: unknown option '%c' !\n", G.prgname, _opt); - cr_usage(); + cr_usage(FALSE); break; } } @@ -197,12 +597,15 @@ int main(int argc, char *argv[]) CR_USAGE ******************************************************************************/ -void cr_usage(void) +void cr_usage(bool disp_config) { - fprintf(stderr, "%s: version %s\n", G.prgname, "1.30"); - fprintf(stderr, "Usage: %s [-h|-eidD1234][-E][-rgybmcwRGYBMCW] regexp ...\n", G.prgname); + fprintf(stderr, "%s: version %s\n", G.prgname, "1.35"); + fprintf(stderr, "Usage: %s [-h|-H|-eidD1234][-E][-rgybmcwRGYBMCW|--config_name] regexp ...\n", + G.prgname); fprintf(stderr, " -h : help\n"); - fprintf(stderr, " -v : version\n"); + fprintf(stderr, " -H : help + configuration names\n"); + fprintf(stderr, " -V : version\n"); + fprintf(stderr, " -v : verbose\n"); fprintf(stderr, " -u : do not bufferize output on stdout\n"); fprintf(stderr, " -e : extended regular expressions\n"); fprintf(stderr, " -i : ignore case\n"); @@ -227,11 +630,63 @@ void cr_usage(void) fprintf(stderr, " -2 : color brightness (normal : default)\n"); fprintf(stderr, " -3 : color brightness (bright)\n"); fprintf(stderr, " -4 : color brightness (underscore)\n"); + + if (disp_config) { + cr_display_config(); + } exit(1); } /****************************************************************************** + CR_DISPLAY_ARGS_LIST + +******************************************************************************/ +void cr_display_args_list(struct cr_config *config) +{ + struct cr_arg *_arg; + + for (_arg = config->extract; _arg != 0; _arg = _arg->next) { + fprintf(stderr, " %s\n", _arg->value); + } + fprintf(stderr, "\n"); +} + +/****************************************************************************** + + CR_DISPLAY_ARGS + +******************************************************************************/ +void cr_display_args(struct cr_config *config) +{ + char **_argv; + + for (_argv = config->argv + 1; *_argv != 0; _argv++) { + fprintf(stderr, " %s\n", *_argv); + } + fprintf(stderr, "\n"); +} + +/****************************************************************************** + + CR_DISPLAY_CONFIG + +******************************************************************************/ +void cr_display_config(void) +{ + struct cr_config *_config; + + fprintf(stderr, " Configurations :\n"); + for (_config = G.configs.extract; _config != 0; _config = _config->next) { + fprintf(stderr, " --%s\n", _config->name); + if (G.verbose) { + cr_display_args(_config); + } + } +} + +/****************************************************************************** + CR_INIT_LIST ******************************************************************************/ @@ -272,6 +727,47 @@ void cr_init_col_names(void) /****************************************************************************** + CR_ADD_CONFIG + +******************************************************************************/ +void cr_add_config(struct cr_config *config) +{ + if (G.configs.insert == 0) { + G.configs.insert = + G.configs.extract = config; + } + else { + G.configs.insert->next = config; + G.configs.insert = config; + } +} + +/****************************************************************************** + + CR_ADD_ARG + +******************************************************************************/ +void cr_add_arg(struct cr_arg *arg) +{ + struct cr_config *_config; + + assert(G.configs.insert != 0); + + _config = G.configs.insert; + if(_config->insert == 0) { + _config->insert = + _config->extract = arg; + } + else { + _config->insert->next = arg; + _config->insert = arg; + } + + _config->argc++; + +} +/****************************************************************************** + CR_SET_COLOR ******************************************************************************/ @@ -373,6 +869,10 @@ void cr_read_input(void) } 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; diff --git a/src/cr_makefile b/src/cr_makefile index 74893af..eb83711 100644 --- a/src/cr_makefile +++ b/src/cr_makefile @@ -1,51 +1,42 @@ -# ============================================================================ -# Copyright (C) 2015 Martial Bornet # -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 3 of the License, or -# (at your option) any later version. +# Fichier makefile du module CR +# ============================= +# MKMF Version 2.7 (alpha 1) # -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program. If not, see <http://www.gnu.org/licenses/>. -# -# -# Fichier makefile du module CR -# ============================= -# MKMF Version 2.7 (alpha 1) -# -# %Z% [%Y%] %M% Version %I% du %E% - %Q% -# -# ============================================================================ include ../makelib1 -# Objets issus de sources "C" -# =========================== +# Objets issus de sources "C" +# =========================== # OBJ_C = $(LIB)(cr_gpri.o) \ $(LIB)(cr_main.o) -# Liste de tous les objets de la bibliotheque -# =========================================== +# Objets issus de sources lex +# =========================== +# +OBJ_LEX = $(LIB)(cr_lex.o) + +# Liste de tous les objets de la bibliotheque +# =========================================== # -OBJ_LIB= $(OBJ_C) +OBJ_LIB= $(OBJ_C) $(OBJ_LEX) -# Regles de production de la bibliotheque de modules objets -# ========================================================= +# Regles de production de la bibliotheque de modules objets +# ========================================================= # include ../makelib2 -# Liste des dependances des fichiers objets -# ========================================= +# Liste des dependances des fichiers objets +# ========================================= # -$(LIB)(cr_gpri.o): cr_epri.h +$(LIB)(cr_gpri.o): cr_cpri.h \ + cr_epri.h + +$(LIB)(cr_lex.o): cr_cpri.h \ + cr_epri.h -$(LIB)(cr_main.o): cr_epri.h +$(LIB)(cr_main.o): cr_cpri.h \ + cr_epri.h Binary files differ |