Skip to content
Permalink
Branch: master
Find file Copy path
Find file Copy path
Fetching contributors…
Cannot retrieve contributors at this time
599 lines (501 sloc) 21.3 KB
/* ########################################################### */
/* This Software is licensed under the GPL licensed Version 2, */
/* please read http://www.gnu.org/copyleft/gpl.html */
/* ########################################################### */
#ifndef SMENU_H
#define SMENU_H
#define CHARSCHUNK 8
#define WORDSCHUNK 8
#define COLSCHUNK 16
#define TPARM1(p, ...) tparm(p, 0, 0, 0, 0, 0, 0, 0, 0, 0)
#define TPARM2(p, q, ...) tparm(p, q, 0, 0, 0, 0, 0, 0, 0, 0)
#define TPARM3(p, q, r, ...) tparm(p, q, r, 0, 0, 0, 0, 0, 0, 0)
#define _XOPEN_SOURCE 700
/* Used for timers management */
/* """""""""""""""""""""""""" */
#define SECOND 1000000
#define FREQ 10
#define TICK (SECOND / FREQ)
/* Bit array management */
/* """""""""""""""""""" */
#define MASK (CHAR_BIT - 1)
#define SHIFT ((CHAR_BIT == 8) ? 3 : (CHAR_BIT == 16) ? 4 : 8)
#define BIT_OFF(a, x) ((void)((a)[(x) >> SHIFT] &= ~(1 << ((x)&MASK))))
#define BIT_ON(a, x) ((void)((a)[(x) >> SHIFT] |= (1 << ((x)&MASK))))
#define BIT_FLIP(a, x) ((void)((a)[(x) >> SHIFT] ^= (1 << ((x)&MASK))))
#define BIT_ISSET(a, x) ((a)[(x) >> SHIFT] & (1 << ((x)&MASK)))
/* ******** */
/* Typedefs */
/* ******** */
typedef struct charsetinfo_s charsetinfo_t;
typedef struct term_s term_t;
typedef struct toggle_s toggle_t;
typedef struct win_s win_t;
typedef struct word_s word_t;
typedef struct attr_s attr_t;
typedef struct limits_s limits_t;
typedef struct timers_s timers_t;
typedef struct misc_s misc_t;
typedef struct sed_s sed_t;
typedef struct timeout_s timeout_t;
typedef struct output_s output_t;
typedef struct daccess_s daccess_t;
typedef struct search_data_s search_data_t;
typedef enum filter_types filters_t;
typedef enum daccess_modes da_mode_t;
typedef enum timeout_modes to_mode_t;
typedef enum attribute_settings attr_set_t;
typedef enum search_modes search_mode_t;
typedef enum bitmap_affinities bitmap_affinity_t;
/* ********** */
/* Prototypes */
/* ********** */
void
help(win_t * win, term_t * term, long last_line, toggle_t * toggle);
int
tag_comp(void * a, void * b);
void
tag_swap(void * a, void * b);
int
isempty(const char * s);
void
beep(toggle_t * toggle);
int
get_cursor_position(int * const r, int * const c);
void
get_terminal_size(int * const r, int * const c);
int
#ifdef __sun
outch(char c);
#else
outch(int c);
#endif
void
restore_term(int const fd);
void
setup_term(int const fd);
void
strip_ansi_color(char * s, toggle_t * toggle);
int
tst_cb(void * elem);
int
tst_cb_cli(void * elem);
int
ini_load(const char * filename, win_t * win, term_t * term, limits_t * limits,
timers_t * timers, misc_t * misc,
int (*report)(win_t * win, term_t * term, limits_t * limits,
timers_t * timers, misc_t * misc, const char * section,
const char * name, char * value));
int
ini_cb(win_t * win, term_t * term, limits_t * limits, timers_t * timers,
misc_t * misc, const char * section, const char * name, char * value);
char *
make_ini_path(char * name, char * base);
void
set_foreground_color(term_t * term, short color);
void
set_background_color(term_t * term, short color);
void
set_win_start_end(win_t * win, long current, long last);
long
build_metadata(term_t * term, long count, win_t * win);
long
disp_lines(win_t * win, toggle_t * toggle, long current, long count,
search_mode_t search_mode, search_data_t * search_data,
term_t * term, long last_line, char * tmp_word,
langinfo_t * langinfo);
void
get_message_lines(char * message, ll_t * message_lines_list,
long * message_max_width, long * message_max_len);
void
disp_message(ll_t * message_lines_list, long width, long max_len, term_t * term,
win_t * win);
void
update_bitmaps(search_mode_t search_mode, search_data_t * search_data,
bitmap_affinity_t affinity);
long
find_next_matching_word(long * array, long nb, long value, long * index);
long
find_prev_matching_word(long * array, long nb, long value, long * index);
void
clean_matches(search_data_t * search_data, long size);
void
disp_cursor_word(long pos, win_t * win, term_t * term, int err);
void
disp_matching_word(long pos, win_t * win, term_t * term, int is_cursor,
int err);
void
disp_word(long pos, search_mode_t search_mode, search_data_t * search_data,
term_t * term, win_t * win, char * tmp_word);
size_t
expand(char * src, char * dest, langinfo_t * langinfo, toggle_t * toggle);
int
get_bytes(FILE * input, char * utf8_buffer, langinfo_t * langinfo);
int
get_scancode(unsigned char * s, size_t max);
char *
get_word(FILE * input, ll_t * word_delims_list, ll_t * record_delims_list,
char * utf8_buffer, unsigned char * is_last, toggle_t * toggle,
langinfo_t * langinfo, win_t * win, limits_t * limits);
void
left_margin_putp(char * s, term_t * term, win_t * win);
void
right_margin_putp(char * s1, char * s2, langinfo_t * langinfo, term_t * term,
win_t * win, long line, long offset);
void
sig_handler(int s);
void
set_new_first_column(win_t * win, term_t * term);
int
parse_sed_like_string(sed_t * sed);
void
parse_selectors(char * str, filters_t * filter, char * unparsed,
ll_t ** inc_interval_list, ll_t ** inc_regex_list,
ll_t ** exc_interval_list, ll_t ** exc_regex_list,
langinfo_t * langinfo);
int
replace(char * orig, sed_t * sed);
int
decode_attr_toggles(char * s, attr_t * attr);
int
parse_attr(char * str, attr_t * attr, short max_color);
void
apply_attr(term_t * term, attr_t attr);
int
delims_cmp(const void * a, const void * b);
long
get_line_last_word(long line, long last_line);
void
move_left(win_t * win, term_t * term, toggle_t * toggle,
search_data_t * search_data, langinfo_t * langinfo, long * nl,
long last_line, char * tmp_word);
void
move_right(win_t * win, term_t * term, toggle_t * toggle,
search_data_t * search_data, langinfo_t * langinfo, long * nl,
long last_line, char * tmp_word);
int
find_best_word_upward(long last_word, long s, long e);
int
find_best_word_downward(long last_word, long s, long e);
void
move_up(win_t * win, term_t * term, toggle_t * toggle,
search_data_t * search_data, langinfo_t * langinfo, long * nl,
long page, long first_selectable, long last_line, char * tmp_word);
void
move_down(win_t * win, term_t * term, toggle_t * toggle,
search_data_t * search_data, langinfo_t * langinfo, long * nl,
long page, long last_selectable, long last_line, char * tmp_word);
/* ***************** */
/* Emums and structs */
/* ***************** */
/* Various filter pseudo constants */
/* """"""""""""""""""""""""""""""" */
enum filter_types
{
UNKNOWN_FILTER,
INCLUDE_FILTER,
EXCLUDE_FILTER
};
/* Used by the -N -F and -D options */
/* """""""""""""""""""""""""""""""" */
enum daccess_modes
{
DA_TYPE_NONE = 0, /* must be 0 (boolean value) */
DA_TYPE_AUTO = 1,
DA_TYPE_POS = 2
};
/* Used when managing the -R option */
/* """""""""""""""""""""""""""""""" */
enum row_regex_types
{
ROW_REGEX_EXCLUDE = 0, /* must be 0 (boolean value) */
ROW_REGEX_INCLUDE = 1
};
/* Used when managing the -C option */
/* """""""""""""""""""""""""""""""" */
enum filter_infos
{
EXCLUDE_MARK = 0, /* must be 0 because used in various tests *
* these words cannot be re-included */
INCLUDE_MARK = 1, /* to forcibly include a word, these words can *
* be excluded later */
SOFT_EXCLUDE_MARK = 2, /* word with this mark are excluded by default *
* but can be included later */
SOFT_INCLUDE_MARK = 3 /* word with this mark are included by default *
* but can be excluded later */
};
/* Various timeout mode used by the -x/-X option */
/* """"""""""""""""""""""""""""""""""""""""""""" */
enum timeout_modes
{
CURRENT, /* on timeout, outputs the selected word */
QUIT, /* on timeout, quit without selecting anything */
WORD /* on timeout , outputs the specified word */
};
/* Constants used to set the color attributes */
/* """""""""""""""""""""""""""""""""""""""""" */
enum attribute_settings
{
UNSET = 0, /* must be 0 for future testings */
SET,
FORCED /* an attribute setting has been given in the command line */
};
/* Constant to distinguish between the various search modes */
/* """""""""""""""""""""""""""""""""""""""""""""""""""""""" */
enum search_modes
{
NONE,
PREFIX,
FUZZY,
SUBSTRING
};
/* Constants used in search mode to orient the bit-mask building */
/* """"""""""""""""""""""""""""""""""""""""""""""""""""""""""""" */
enum bitmap_affinities
{
NO_AFFINITY,
END_AFFINITY,
START_AFFINITY
};
/* Used to store the different allowed charsets data */
/* """"""""""""""""""""""""""""""""""""""""""""""""" */
struct charsetinfo_s
{
char * name; /* canonical name of the allowed charset */
int bits; /* number of bits in this charset */
};
/* Various toggles which can be set with command line options */
/* """""""""""""""""""""""""""""""""""""""""""""""""""""""""" */
struct toggle_s
{
int del_line; /* 1 if the clean option is set (-d) else 0 */
int enter_val_in_search; /* 1 if ENTER validates in search mode else 0 */
int no_scrollbar; /* 1 to disable the scrollbar display else 0 */
int blank_nonprintable; /* 1 to try to display non-blanks in *
* symbolic form else 0 */
int keep_spaces; /* 1 to keep the trailing spaces in columns *
* and tabulate mode. */
int taggable; /* 1 if tagging is enabled */
int pinable; /* 1 if pinning is selected */
int autotag; /* 1 if tagging is selected and pinning is *
* not and we do no want an automatic tagging *
* when the users presses <ENTER> */
int visual_bell; /* 1 to flash the window, 0 to make a sound */
};
/* Structure to store the default or imposed smenu limits */
/* """""""""""""""""""""""""""""""""""""""""""""""""""""" */
struct limits_s
{
long word_length; /* maximum number of bytes in a word */
long words; /* maximum number of words */
long cols; /* maximum number of columns */
};
/* Structure to store the default or imposed timers */
/* """""""""""""""""""""""""""""""""""""""""""""""" */
struct timers_s
{
int search;
int help;
int winch;
int direct_access;
};
/* Structure to store miscellaneous informations */
/* """"""""""""""""""""""""""""""""""""""""""""" */
struct misc_s
{
search_mode_t default_search_method;
};
/* Terminal setting variables */
/* """""""""""""""""""""""""" */
struct termios new_in_attrs;
struct termios old_in_attrs;
/* Interval timers used */
/* """""""""""""""""""" */
struct itimerval periodic_itv; /* refresh rate for the timeout counter */
int help_timer = -1;
int winch_timer = -1;
int daccess_timer = -1;
/* Structure containing the attributes components */
/* """""""""""""""""""""""""""""""""""""""""""""" */
struct attr_s
{
attr_set_t is_set;
short fg;
short bg;
signed char bold;
signed char dim;
signed char reverse;
signed char standout;
signed char underline;
signed char italic;
};
/* Structure containing some terminal characteristics */
/* """""""""""""""""""""""""""""""""""""""""""""""""" */
struct term_s
{
int ncolumns; /* number of columns */
int nlines; /* number of lines */
int curs_column; /* current cursor column */
int curs_line; /* current cursor line */
short colors; /* number of available colors */
short color_method; /* color method (0=classic (0-7), 1=ANSI) */
char has_cursor_up; /* has cuu1 terminfo capability */
char has_cursor_down; /* has cud1 terminfo capability */
char has_cursor_left; /* has cub1 terminfo capability */
char has_cursor_right; /* has cuf1 terminfo capability */
char has_parm_right_cursor; /* has cuf terminfo capability */
char has_cursor_address; /* has cup terminfo capability */
char has_save_cursor; /* has sc terminfo capability */
char has_restore_cursor; /* has rc terminfo capability */
char has_setf; /* has set_foreground terminfo capability */
char has_setb; /* has set_background terminfo capability */
char has_setaf; /* idem for set_a_foreground (ANSI) */
char has_setab; /* idem for set_a_background (ANSI) */
char has_hpa; /* has column_address terminfo capability */
char has_bold; /* has bold mode */
char has_dim; /* has dim mode */
char has_reverse; /* has reverse mode */
char has_underline; /* has underline mode */
char has_standout; /* has standout mode */
char has_italic; /* has italic mode */
};
/* Structure describing a word */
/* """"""""""""""""""""""""""" */
struct word_s
{
long start, end; /* start/end absolute horiz. word positions *
* on the screen */
size_t mb; /* number of UTF-8 glyphs to display */
long tag_order; /* each time a word is tagged, this value *
* is increased */
size_t special_level; /* can vary from 0 to 5; 0 meaning normal */
char * str; /* display string associated with this word */
size_t len; /* number of bytes of str (for trimming) */
char * orig; /* NULL or original string if is had been *
* shortened for being displayed or altered *
* by is expansion. */
char * bitmap; /* used to store the the position of the *
* currently searched chars in a word. The *
* objective is to speed their display */
unsigned char is_matching;
unsigned char is_tagged; /* 1 if the word is tagged, 0 if not */
unsigned char is_last; /* 1 if the word is the last of a line */
unsigned char is_selectable; /* word is selectable */
unsigned char is_numbered; /* word has a direct access index */
};
/* Structure describing the window in which the user */
/* will be able to select a word */
/* """"""""""""""""""""""""""""""""""""""""""""""""" */
struct win_s
{
long start, end; /* index of the first and last word */
long first_column; /* number of the first character displayed */
long cur_line; /* relative number of the cursor line (1+) */
long asked_max_lines; /* requested number of lines in the window */
long max_lines; /* effective number of lines in the window */
long max_cols; /* max number of words in a single line */
long real_max_width; /* max line length. In column, tab or line *
* mode it can be greater than the *
* terminal width */
long message_lines; /* number of lines taken by the messages *
* (updated by disp_message */
long max_width; /* max usable line width or the terminal */
long offset; /* window offset user when centered */
char * sel_sep; /* output separator when tags are enabled */
char ** gutter_a; /* array of UTF-8 gutter glyphs */
long gutter_nb; /* number of UTF-8 gutter glyphs */
unsigned char tab_mode; /* -t */
unsigned char col_mode; /* -c */
unsigned char line_mode; /* -l */
unsigned char col_sep; /* -g */
unsigned char wide; /* -w */
unsigned char center; /* -M */
attr_t cursor_attr; /* current cursor attributes */
attr_t cursor_on_tag_attr; /* current cursor on tag attributes */
attr_t bar_attr; /* scrollbar attributes */
attr_t shift_attr; /* shift indicator attributes */
attr_t message_attr; /* message (title) attributes */
attr_t search_field_attr; /* search mode field attributes */
attr_t search_text_attr; /* search mode text attributes */
attr_t search_err_field_attr; /* bad search mode field attributes */
attr_t search_err_text_attr; /* bad search mode text attributes */
attr_t match_field_attr; /* matching word field attributes */
attr_t match_text_attr; /* matching word text attributes */
attr_t match_err_field_attr; /* bad matching word field attributes */
attr_t match_err_text_attr; /* bad matching word text attributes */
attr_t include_attr; /* selectable words attributes */
attr_t exclude_attr; /* non-selectable words attributes */
attr_t tag_attr; /* non-selectable words attributes */
attr_t daccess_attr; /* direct access tag attributes */
attr_t special_attr[5]; /* special (-1,...) words attributes */
};
/* Sed like node structure */
/* """"""""""""""""""""""" */
struct sed_s
{
char * pattern; /* pattern to be matched */
char * substitution; /* substitution string */
unsigned char visual; /* visual flag: alterations are only *
* visual */
unsigned char global; /* global flag: alterations can *
* occur more than once */
unsigned char stop; /* stop flag: only one alteration *
* per word is allowed */
regex_t re; /* compiled regular expression */
};
/* Structure used to keep track of the different timeout values */
/* """""""""""""""""""""""""""""""""""""""""""""""""""""""""""" */
struct timeout_s
{
to_mode_t mode; /* timeout mode: current/quit/word */
unsigned initial_value; /* 0: no timeout else value in sec */
unsigned remain; /* remaining seconds */
unsigned reached; /* 1: timeout has expired, else 0 */
};
/* Structure used during the construction of the pinned words list */
/* """"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" */
struct output_s
{
long order; /* this field is incremented each time a word is pinned */
char * output_str; /* The pinned word itself */
};
/* Structure describing the formating of the automatic direct access entries */
/* """"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" */
struct daccess_s
{
da_mode_t mode; /* DA_TYPE_NONE (0), DA_TYPE_AUTO, DA_TYPE_POS */
char * left; /* character to put before the direct access selector */
char * right; /* character to put after the direct access selector */
char alignment; /* l: left; r: right */
char padding; /* a: all; i: only included words are padded */
char head; /* What to do with chars before the embedded number */
int length; /* selector size (5 max) */
int flength; /* 0 or length + 3 (full prefix lengh */
size_t offset; /* offset to the start of the selector */
int plus; /* 1 if we can look for the number to extract after *
* the offset, else 0. (a '+' follows the offset) */
int size; /* size in bytes of the selector to extract */
size_t ignore; /* number of UTF-8 glyphs to ignore after the number */
char follow; /* y: the numbering follows the last nuber set */
char * num_sep; /* character to separate de number and the selection */
int def_number; /* 1: the numbering is on by default 0: it is not */
};
/* Structure used in search mod to store the current buffer and various */
/* related values. */
/* """""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" */
struct search_data_s
{
char * buf; /* search buffer */
long len; /* current position in the search buffer */
long utf8_len; /* current position in the search buffer in *
* UTF-8 units */
long * utf8_off_a; /* array of mb offsets in buf */
long * utf8_len_a; /* array of mb lengths in buf */
int fuzzy_err; /* fuzzy match error indicator */
long fuzzy_err_pos; /* last good position in search buffer */
int only_ending; /* only searches giving a result with the *
* pattern at the end of the word will be *
* selected */
int only_starting; /* same with the pattern at the beginning */
};
#endif
You can’t perform that action at this time.