diff --git a/Makefile b/Makefile index 747f5b1..7657527 100644 --- a/Makefile +++ b/Makefile @@ -1,22 +1,14 @@ DEBUG:=1 GCC:=0 -CC=gcc +CC:=gcc CFLAGS:=-Wall -Wextra -Wpedantic -CPPFLAGS:=${shell pkg-config --cflags ncurses readline} -LDLIBS=-I ${CHDRD} ${shell pkg-config --libs ncurses readline} +CFLAGS +=$(if $(DEBUG),-O0 -ggdb,-O3 -flto=auto -fomit-frame-pointer) +CFLAGS +=$(if $(SAN),-fsanitize=${SAN}) +CPPFLAGS:=-I config/ -I ${CHDRD} ${shell pkg-config --cflags ncurses readline} +LDLIBS=${shell pkg-config --libs ncurses readline} LEX:=flex -ifeq (${DEBUG},1) - CFLAGS += -O0 -ggdb -else - CFLAGS += -O3 -flto=auto -fomit-frame-pointer -endif - -ifdef SAN - CFLAGS += -fsanitize=${SAN} -endif - LEXD:=src/ LEXF:=$(shell find ${LEXD} -iname '*.l') GENLEX:=$(subst .l,.c,${LEXF}) @@ -27,9 +19,10 @@ SRC:=$(shell find ${SRCD} -iname '*.c') ${GENLEX} OBJ:=$(subst .c,.o,$(subst ${SRCD},${OBJD},${SRC})) HDRD:=${SRCD} +CONFD:=config/ CHDRD:=${OBJD} -HDR:=$(shell find ${HDRD} -iname '*.h') -CHDR:=$(addsuffix .gch,$(subst ${HDRD},${CHDRD},${HDR})) +HDR:=$(shell find ${HDRD} ${CONFD} -iname '*.h') +CHDR:=$(addsuffix .gch,$(subst ${HDRD},${CHDRD},$(subst ${CONFD}, ${CHDRD}, ${HDR}))) OUTPUT:=csope @@ -45,6 +38,9 @@ src/%.c: src/%.l obj/%.h.gch: src/%.h ${CC} $< -o $@ +obj/%.h.gch: config/%.h + ${CC} $< -o $@ + clean: -rm ${CHDR} -rm ${GENLEX} diff --git a/config/colors.h b/config/colors.h new file mode 100644 index 0000000..c3a4a08 --- /dev/null +++ b/config/colors.h @@ -0,0 +1,92 @@ +#ifndef CONFIG_H +#define CONFIG_H + +/* List of color options: + COLOR_BLACK + COLOR_RED + COLOR_GREEN + COLOR_YELLOW + COLOR_BLUE + COLOR_MAGENTA + COLOR_CYAN + COLOR_WHITE + -1 // for transparent (only works if that is your default terminal background) +*/ + +/* --- Valid presets --- */ +#define STD_PRESET 1 +#define COLORFUL_PRESET 2 + +/* --- Preset selection --- */ +#define COLOR_PRESET 2 + +#if COLOR_PRESET == 1 +#elif COLOR_PRESET == 2 +# define COLOR_FRAME_FG COLOR_GREEN +# define COLOR_FRAME_BG -1 +# define COLOR_PROMPT_FG COLOR_BLUE +# define COLOR_PROMPT_BG -1 +# define COLOR_CURSOR COLOR_WHITE +# define COLOR_FIELD_FG COLOR_WHITE +# define COLOR_FIELD_BG -1 +# define COLOR_FIELD_SELECTED_FG COLOR_BLACK +# define COLOR_FIELD_SELECTED_BG COLOR_WHITE +# define COLOR_HELP_FG COLOR_YELLOW +# define COLOR_HELP_BG -1 +# define COLOR_TOOLTIP_FG COLOR_BLACK +# define COLOR_TOOLTIP_BG COLOR_WHITE +# define COLOR_MESSAGE_FG COLOR_WHITE +# define COLOR_MESSAGE_BG COLOR_BLACK +# define COLOR_PATTERN_FG COLOR_WHITE +# define COLOR_PATTERN_BG -1 +# define COLOR_TABLE_HEADER_FG COLOR_YELLOW +# define COLOR_TABLE_HEADER_BG -1 +# define COLOR_TABLE_ID_FG COLOR_CYAN +# define COLOR_TABLE_ID_BG -1 +# define COLOR_TABLE_COL_FILE_FG COLOR_MAGENTA +# define COLOR_TABLE_COL_FILE_BG -1 +# define COLOR_TABLE_COL_FUNCTION_FG COLOR_RED +# define COLOR_TABLE_COL_FUNCTION_BG -1 +# define COLOR_TABLE_COL_LINE_FG COLOR_CYAN +# define COLOR_TABLE_COL_LINE_BG -1 +# define COLOR_TABLE_COL_TEXT_FG COLOR_GREEN +# define COLOR_TABLE_COL_TEXT_BG -1 +# define COLOR_PAGER_MSG_FG COLOR_YELLOW +# define COLOR_PAGER_MSG_BG -1 +#else +# error "Color profile not valid" +#endif + +enum color_pairs{ + COLOR_PAIR_FRAME = 1, + COLOR_PAIR_PROMPT, + COLOR_PAIR_FIELD, + COLOR_PAIR_FIELD_SELECTED, + COLOR_PAIR_HELP, + COLOR_PAIR_TOOLTIP, + COLOR_PAIR_PATTERN, + COLOR_PAIR_MESSAGE, + COLOR_PAIR_TABLE_HEADER, + COLOR_PAIR_TABLE_ID, + COLOR_PAIR_TABLE_COL_FILE, + COLOR_PAIR_TABLE_COL_FUNCTION, + COLOR_PAIR_TABLE_COL_LINE, + COLOR_PAIR_TABLE_COL_TEXT, + COLOR_PAIR_PAGER_MSG +}; + +#define easy_init_pair(x) init_pair(COLOR_PAIR_ ## x, COLOR_ ## x ## _FG, COLOR_ ## x ## _BG) + +/* Other options: + A_NORMAL : Normal display (no highlight) + A_UNDERLINE : Underlining + A_REVERSE : Reverse video + A_BLINK : Blinking + A_BOLD : Extra bright or bold + A_STANDOUT : Best highlighting mode of the terminal. + NOTE: you can specify more than one by separating the options by a '|' sign. + { A_BLINK | A_BOLD } +*/ +#define ATTRIBUTE_FIELD_SELECTED A_BOLD + +#endif diff --git a/src/display.c b/src/display.c index 3c965dc..b46ec7a 100644 --- a/src/display.c +++ b/src/display.c @@ -37,6 +37,7 @@ #include "global.h" #include "build.h" +#include "colors.h" #ifdef CCS #include "sgs.h" /* ESG_PKG and ESG_REL */ @@ -144,6 +145,23 @@ dispinit(void) { /* initialize the curses display package */ initscr(); /* initialize the screen */ + start_color(); + use_default_colors(); + easy_init_pair(FRAME); + easy_init_pair(PROMPT); + easy_init_pair(FIELD); + easy_init_pair(FIELD_SELECTED); + easy_init_pair(HELP); + easy_init_pair(TOOLTIP); + easy_init_pair(MESSAGE); + easy_init_pair(PATTERN); + easy_init_pair(TABLE_HEADER); + easy_init_pair(TABLE_ID); + easy_init_pair(TABLE_COL_LINE); + easy_init_pair(TABLE_COL_FILE); + easy_init_pair(TABLE_COL_FUNCTION); + easy_init_pair(TABLE_COL_TEXT); + easy_init_pair(PAGER_MSG); entercurses(); /* Calculate section sizes */ @@ -152,7 +170,7 @@ dispinit(void) mode_window_height = LINES - input_window_height - 2 - 1; first_col_width = 48; // (((COLS - 2)%2 == 0) ? ((COLS-2)/2) : (((COLS-2)/2)+1)); second_col_width = COLS - 2 - 1 - first_col_width; //((COLS - 2) / 2) - 1; - mdisprefs = result_window_height - WRESULT_TABLE_BODY_START - 1 - 1; + mdisprefs = result_window_height - WRESULT_TABLE_BODY_START - 1 - 1 - 1; if (mdisprefs <= 0) { postfatal("%s: screen too small\n", argv0); @@ -216,44 +234,51 @@ exitcurses(void) } static inline void display_help(){ + // XXX: this could be optimized by only overriding the buffer if theres an actual change werase(whelp); wmove(whelp, 0, 0); + wattron(whelp, COLOR_PAIR(COLOR_PAIR_HELP)); waddstr(whelp, help()); + wattroff(whelp, COLOR_PAIR(COLOR_PAIR_HELP)); + + refresh(); wrefresh(whelp); + do_press_any_key = true; - window_change = CH_ALL; } -static inline void display_frame(){ +static inline void display_frame(const bool border_only){ + wattron(stdscr, COLOR_PAIR(COLOR_PAIR_FRAME)); + box(stdscr, 0, 0); - /* Vertical line */ - mvaddch(0, first_col_width + 1, ACS_TTEE); - for(int i = 0; i < LINES-2; i++){ - mvaddch(i+1, first_col_width + 1, ACS_VLINE); - } - mvaddch(LINES-1, first_col_width + 1, ACS_BTEE); - /* Horizontal line */ - wmove(stdscr, input_window_height + 1, 0); - addch(ACS_LTEE); - for(int i = 0; i < first_col_width; i++){ - addch(ACS_HLINE); - } - addch(ACS_RTEE); /* Title*/ const int LEFT_PADDING = 5; wmove(stdscr, 0, LEFT_PADDING); #if CCS - if (displayversion == true) { - wprintw(stdscr, "cscope %s", ESG_REL); - } - else { - waddstr(stdscr, "cscope"); - } + wprintw(stdscr, "cscope %s", ESG_REL); #else wprintw(stdscr, "Cscope version %d%s", FILEVERSION, FIXVERSION); #endif wmove(stdscr, 0, COLS - (int)sizeof(helpstring) - 3); waddstr(stdscr, helpstring); + /* --- */ + if(!border_only){ + /* Vertical line */ + mvaddch(0, first_col_width + 1, ACS_TTEE); + for(int i = 0; i < LINES-2; i++){ + mvaddch(i+1, first_col_width + 1, ACS_VLINE); + } + mvaddch(LINES-1, first_col_width + 1, ACS_BTEE); + /* Horizontal line */ + wmove(stdscr, input_window_height + 1, 0); + addch(ACS_LTEE); + for(int i = 0; i < first_col_width; i++){ + addch(ACS_HLINE); + } + addch(ACS_RTEE); + } + + wattroff(stdscr, COLOR_PAIR(COLOR_PAIR_FRAME)); } static inline void display_mode(){ @@ -261,18 +286,22 @@ static inline void display_mode(){ for(int i = 0; i < FIELDS; ++i){ if(i == field){ - wattron(wmode, A_REVERSE); + wattron(wmode, COLOR_PAIR(COLOR_PAIR_FIELD_SELECTED) | ATTRIBUTE_FIELD_SELECTED); mvwprintw(wmode, i, 0, "%s %s", fields[i].text1, fields[i].text2); - wattroff(wmode, A_REVERSE); + wattroff(wmode, COLOR_PAIR(COLOR_PAIR_FIELD_SELECTED) | ATTRIBUTE_FIELD_SELECTED); }else{ + wattron(wmode, COLOR_PAIR(COLOR_PAIR_FIELD)); mvwprintw(wmode, i, 0, "%s %s", fields[i].text1, fields[i].text2); + wattroff(wmode, COLOR_PAIR(COLOR_PAIR_FIELD)); } } } static inline void display_command_field(){ werase(winput); + wattron(winput, COLOR_PAIR(COLOR_PAIR_PROMPT)); mvwaddstr(winput, 0, 0, prompts[input_mode]); + wattroff(winput, COLOR_PAIR(COLOR_PAIR_PROMPT)); waddstr(winput, rl_line_buffer); } static inline void display_results(){ @@ -293,7 +322,9 @@ static inline void display_results(){ if (totallines == 0) { // Its a real message wmove(wresult, MSGLINE, 0); wclrtoeol(wresult); + wattron(wresult, COLOR_PAIR(COLOR_PAIR_MESSAGE)); waddstr(wresult, lastmsg); + wattroff(wresult, COLOR_PAIR(COLOR_PAIR_MESSAGE)); return; } if (input_mode == INPUT_CHANGE) { // Its a pattern @@ -302,9 +333,12 @@ static inline void display_results(){ snprintf(lastmsg, MSGLEN, "%c%s: %s", toupper((unsigned char)fields[field].text2[0]), fields[field].text2 + 1, input_line); } + wattron(wresult, COLOR_PAIR(COLOR_PAIR_PATTERN)); waddstr(wresult, lastmsg); + wattroff(wresult, COLOR_PAIR(COLOR_PAIR_PATTERN)); /* --- Display the column headings --- */ + wattron(wresult, COLOR_PAIR(COLOR_PAIR_TABLE_HEADER)); wmove(wresult, 2, 2); if (ogs == true && field != FILENAME) { wprintw(wresult, "%-*s ", subsystemlen, "Subsystem"); @@ -319,6 +353,7 @@ static inline void display_results(){ if (field != FILENAME) { waddstr(wresult, "Line"); } + wattroff(wresult, COLOR_PAIR(COLOR_PAIR_TABLE_HEADER)); /* --- Display table entries --- */ wmove(wresult, WRESULT_TABLE_BODY_START, 0); @@ -367,7 +402,9 @@ static inline void display_results(){ ++nextline; displine[disprefs] = screenline; + wattron(wresult, COLOR_PAIR(COLOR_PAIR_TABLE_ID)); wprintw(wresult, "%c", dispchars[disprefs]); + wattroff(wresult, COLOR_PAIR(COLOR_PAIR_TABLE_ID)); /* display any change mark */ if (input_mode == INPUT_CHANGE && change[topref + disprefs]) { @@ -377,6 +414,7 @@ static inline void display_results(){ } /* display the file name */ + wattron(wresult, COLOR_PAIR(COLOR_PAIR_TABLE_COL_FILE)); if (field == FILENAME) { wprintw(wresult, "%-*s ", filelen, file); } else { @@ -392,24 +430,30 @@ static inline void display_results(){ pathcomponents(file, dispcomponents)); } } /* else(field == FILENAME) */ + wattroff(wresult, COLOR_PAIR(COLOR_PAIR_TABLE_COL_FILE)); /* display the function name */ - if (field == SYMBOL || field == CALLEDBY || field == CALLING) { - wprintw(wresult, "%-*.*s ", fcnlen, fcnlen, function); + if(field == SYMBOL || field == CALLEDBY || field == CALLING){ + wattron(wresult, COLOR_PAIR(COLOR_PAIR_TABLE_COL_FUNCTION)); + wprintw(wresult, "%-*.*s ", fcnlen, fcnlen, function); + wattroff(wresult, COLOR_PAIR(COLOR_PAIR_TABLE_COL_FUNCTION)); } - if (field == FILENAME) { - waddch(wresult, '\n'); /* go to next line */ - continue; + if(field == FILENAME){ + waddch(wresult, '\n'); /* go to next line */ + continue; } /* display the line number */ + wattron(wresult, COLOR_PAIR(COLOR_PAIR_TABLE_COL_LINE)); wprintw(wresult, "%*s ", numlen, linenum); + wattroff(wresult, COLOR_PAIR(COLOR_PAIR_TABLE_COL_LINE)); /* there may be tabs in egrep output */ - while ((s = strchr(tempstring, '\t')) != NULL) { - *s = ' '; + while((s = strchr(tempstring, '\t')) != NULL){ + *s = ' '; } /* display the source line */ + wattron(wresult, COLOR_PAIR(COLOR_PAIR_TABLE_COL_TEXT)); s = tempstring; for (;;) { /* if the source line does not fit */ @@ -467,6 +511,7 @@ static inline void display_results(){ wmove(wresult, screenline, second_col_width - srctxtw); } /* for(ever) */ } /* for(reference output lines) */ + wattron(wresult, COLOR_PAIR(COLOR_PAIR_TABLE_COL_TEXT)); endrefs: /* position the screen cursor for the message */ @@ -477,6 +522,8 @@ endrefs: else { wmove(wresult, i, 0); } + /* --- display pager message --- */ + wattron(wresult, COLOR_PAIR(COLOR_PAIR_PAGER_MSG)); /* check for more references */ i = totallines - nextline + 1; bottomline = nextline; @@ -487,6 +534,7 @@ endrefs: else if (current_page > 0 && nextline > totallines) { waddstr(wresult, "* Press the space bar to display the first lines again *"); } + wattroff(wresult, COLOR_PAIR(COLOR_PAIR_PAGER_MSG)); } void display_cursor(void){ @@ -710,14 +758,17 @@ display(void) if(window_change){ if(window_change == CH_HELP){ + display_frame(true); display_help(); - /* Do not display over the help msg and */ - /* rely on display_help() setting CH_ALL */ + /* Do not display over the help msg and + * rely on setting CH_ALL for the next display + */ + window_change = CH_ALL; return; } /**/ if(window_change == CH_ALL){ - display_frame(); + display_frame(false); } if(window_change & CH_INPUT){ display_command_field(); diff --git a/src/edit.c b/src/edit.c index 675896c..b7272ec 100644 --- a/src/edit.c +++ b/src/edit.c @@ -93,7 +93,7 @@ editall(void) /* call the editor */ void -edit(char *file, char *linenum) +edit(char *file, const char *const linenum) { const char *const editor_basename = basename(editor); char msg[MSGLEN + 1]; /* message */ @@ -135,7 +135,7 @@ edit(char *file, char *linenum) /* if requested, prepend a path to a relative file name */ char * -filepath(const char *file) +filepath(char *file) { static char path[PATHLEN + 1]; diff --git a/src/global.h b/src/global.h index e8def77..f1f7d7c 100644 --- a/src/global.h +++ b/src/global.h @@ -124,9 +124,6 @@ extern char *argv0; /* command name */ extern bool compress; /* compress the characters in the crossref */ extern bool dbtruncated; /* database symbols truncated to 8 chars */ extern int dispcomponents; /* file path components to display */ -#if CCS -extern bool displayversion; /* display the C Compilation System version */ -#endif extern bool editallprompt; /* prompt between editing files */ extern unsigned int fileargc; /* file argument count */ extern char **fileargv; /* file argument values */ @@ -142,12 +139,13 @@ extern char *namefile; /* file of file names */ extern bool ogs; /* display OGS book and subsystem names */ extern char *prependpath; /* prepend path to file names */ extern FILE *refsfound; /* references found file */ -extern char temp1[]; /* temporary file name */ -extern char temp2[]; /* temporary file name */ extern long totalterms; /* total inverted index terms */ extern bool trun_syms; /* truncate symbols to 8 characters */ extern char tempstring[TEMPSTRING_LEN + 1]; /* global dummy string buffer */ + extern char *tmpdir; /* temporary directory */ +extern char temp1[]; /* temporary file name */ +extern char temp2[]; /* temporary file name */ /* command.c global data */ extern bool caseless; /* ignore letter case when searching */ @@ -167,10 +165,10 @@ extern char currentdir[]; /* current directory */ extern char **incdirs; /* #include directories */ extern char **srcdirs; /* source directories */ extern char **srcfiles; /* source files */ -extern unsigned long nincdirs; /* number of #include directories */ -extern unsigned long nsrcdirs; /* number of source directories */ -extern unsigned long nsrcfiles; /* number of source files */ -extern unsigned long msrcfiles; /* maximum number of source files */ +extern size_t nincdirs; /* number of #include directories */ +extern size_t nsrcdirs; /* number of source directories */ +extern size_t nsrcfiles; /* number of source files */ +extern size_t msrcfiles; /* maximum number of source files */ /* display.c global data */ extern int subsystemlen; /* OGS subsystem name display field length */ @@ -215,7 +213,7 @@ extern bool unixpcmouse; /* UNIX PC mouse interface */ /* cscope functions called from more than one function or between files */ -char *filepath(const char *file); +char *filepath(char *file); char *findsymbol(const char *pattern); char *finddef(const char *pattern); char *findcalledby(const char *pattern); @@ -261,8 +259,8 @@ void addcmd(int f, char *s); void addsrcfile(char *path); void askforchar(void); void askforreturn(void); -void cannotwrite(char *file); -void cannotopen(char *file); +void cannotwrite(const char *const file); +void cannotopen(const char *const file); void clearmsg(void); void clearmsg2(void); void countrefs(void); @@ -270,7 +268,7 @@ void crossref(char *srcfile); void dispinit(void); void display(void); void drawscrollbar(int top, int bot); -void edit(char *file, char *linenum); +void edit(char *file, const char *const linenum); void editall(void); void editref(int); void entercurses(void); diff --git a/src/main.c b/src/main.c index 011ac6c..172edc8 100644 --- a/src/main.c +++ b/src/main.c @@ -72,9 +72,6 @@ char *argv0; /* command name */ bool compress = true; /* compress the characters in the crossref */ bool dbtruncated; /* database symbols are truncated to 8 chars */ int dispcomponents = 1; /* file path components to display */ -#if CCS -bool displayversion; /* display the C Compilation System version */ -#endif bool editallprompt = true; /* prompt between editing files */ unsigned int fileargc; /* file argument count */ char **fileargv; /* file argument values */ @@ -150,14 +147,14 @@ siginit(void){ } void -cannotopen(char *file) +cannotopen(const char *const file) { posterr("Cannot open file %s", file); } /* FIXME MTE - should use postfatal here */ void -cannotwrite(char *file) +cannotwrite(const char *const file) { char msg[MSGLEN + 1];