summaryrefslogtreecommitdiffstats
path: root/smenu.h
diff options
context:
space:
mode:
authorpgen <p.gen.progs@gmail.com>2018-09-29 11:03:34 +0200
committerpgen <p.gen.progs@gmail.com>2018-10-01 19:36:56 +0200
commit79ddfc36120edfedf8c7c2ea6ce4eff05fac4fb6 (patch)
tree945c75f62c997619485b16c401ee6ca935aac7d2 /smenu.h
parent9fee0325cc5569a9c909730e404994c3ad0d51c1 (diff)
Create smenu.h
Diffstat (limited to 'smenu.h')
-rw-r--r--smenu.h613
1 files changed, 613 insertions, 0 deletions
diff --git a/smenu.h b/smenu.h
new file mode 100644
index 0000000..72c742b
--- /dev/null
+++ b/smenu.h
@@ -0,0 +1,613 @@
+#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 interval_s interval_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);
+
+void
+short_usage(void);
+
+void
+usage(void);
+
+char *
+concat(const char * s1, ...);
+
+interval_t *
+interval_new(void);
+
+int
+interval_comp(void * a, void * b);
+
+void
+interval_swap(void * a, void * b);
+
+int
+tag_comp(void * a, void * b);
+
+void
+tag_swap(void * a, void * b);
+
+void
+ltrim(char * str, const char * trim);
+
+void
+rtrim(char * str, const char * trim, size_t min_len);
+
+int
+isempty(const char * str);
+
+int
+my_strcasecmp(const char * str1, const char * str2);
+
+char *
+my_strcpy(char * dst, char * src);
+
+int
+isprint7(int i);
+
+int
+isprint8(int i);
+
+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
+strprefix(char * str1, char * str2);
+
+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 ending_pattern);
+
+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_matching,
+ 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);
+
+int
+egetopt(int nargc, char ** nargv, char * ostr);
+
+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);
+
+void
+merge_intervals(ll_t * list);
+
+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 (*my_isprint)(int);
+
+int
+delims_cmp(const void * a, const void * b);
+
+/* ***************** */
+/* 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 */
+};
+
+enum timeout_modes
+{
+ CURRENT, /* on timeout, outputs the selected word */
+ QUIT, /* on timeout, quit without selecting anything */
+ WORD /* on timeout , outputs the specified word */
+};
+
+enum attribute_settings
+{
+ UNSET = 0, /* must be 0 for future testings */
+ SET,
+ FORCED /* an attribute setting has been given in the command line */
+};
+
+enum search_modes
+{
+ NONE,
+ PREFIX,
+ FUZZY,
+ SUBSTRING
+};
+
+enum bitmap_affinities
+{
+ NO_AFFINITY,
+ END_AFFINITY,
+ START_AFFINITY
+};
+
+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 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;
+};
+
+/* Interval structure for use in lists of columns and rows */
+/* """"""""""""""""""""""""""""""""""""""""""""""""""""""" */
+struct interval_s
+{
+ long low;
+ long high;
+};
+
+/* Structure used by the replace function to delimit matches */
+/* """"""""""""""""""""""""""""""""""""""""""""""""""""""""" */
+struct range_s
+{
+ size_t start;
+ size_t end;
+};
+
+/* 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;
+ char * output_str;
+};
+
+/* 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 */
+};
+
+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