summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authormbornet-hl <mbornet.pro@wanadoo.fr>2015-07-09 23:37:34 +0200
committermbornet-hl <mbornet.pro@wanadoo.fr>2015-07-09 23:37:34 +0200
commitb9f1a1491484178af5625a485363c5fc055597c0 (patch)
tree98f07192c2913b1c41924829d88c5a52bc1294ac
parenta6ab43061a6dee2502257bcb3ae550c0e68c8e33 (diff)
downloadhl-b9f1a1491484178af5625a485363c5fc055597c0.zip
hl-b9f1a1491484178af5625a485363c5fc055597c0.tar.gz
hl-b9f1a1491484178af5625a485363c5fc055597c0.tar.bz2
hl can now use a configuration file.
-rw-r--r--src/.hl.cfg156
-rw-r--r--src/Makefile6
-rw-r--r--src/cr_cpri.h88
-rw-r--r--src/cr_epri.h18
-rw-r--r--src/cr_gpri.c5
-rw-r--r--src/cr_lex.l130
-rw-r--r--src/cr_main.c548
-rw-r--r--src/cr_makefile57
-rwxr-xr-xsrc/hlbin15120 -> 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
diff --git a/src/hl b/src/hl
index 35075f3..f3b6b2a 100755
--- a/src/hl
+++ b/src/hl
Binary files differ