2
3
4
5
6
7
8
11
12
13
16#include "../ui/ui_ncurses_internal.h"
17#include "ui_backend.h"
18#include <ncursesw/ncurses.h>
19#include <ncursesw/panel.h>
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52#define get_next_char()
56 if (view->file_pos == view->file_size) {
61 c = view->buf[view->file_pos++];
67
68
69
70
71
72
73
74
75#define get_prev_char()
79 if (view->file_pos == 0
) {
84 c = view->buf[--view->file_pos];
90 if ((c = get_cmd_char(view, &n_cmd)) == 'y' || c == 'Y')
92 else if (c == 'n' || c == 'N')
96#define _ui_perror(msg)
98 ssnprintf(em0, MAXLEN - 1
, _("%s, line: %d"), __FILE__, __LINE__ - 2
);
99 strnz__cpy(em1, msg, MAXLEN - 1
);
100 ui_display_error(em0, em1, nullptr, nullptr);
103#define _Refresh(view)
116void lp(View *,
char *);
122bool search(View *,
int,
char *);
142int a_toi(
char *,
bool *);
147void sync_ln(View *, off_t ln_no);
153
154
155
156
157
158
159
160
208
209
210
211
212
213
220 int prev_search_cmd = 0;
224 ssize_t bytes_written;
226 char shell_cmd_spec[
MAXLEN];
231 UiSurface *sfc = view
->sfc;
244 if (c >=
'0' && c <=
'9') {
245 tmp_str[0] = (
char)c;
256 ui_log(INFO,
_(
"Resize key received"));
258 ui_log(INFO,
_(
"Resize: lines=%d, cols=%d"), view
->lines, view
->cols);
266
270
271
278
283 else if (n_cmd == 0) {
299 else if (n_cmd == 0) {
381 else if (c ==
'n' || c ==
'N')
397 view
, _(
"view->f_squeeze Multiple Blank lines (Y or N)->"));
403 view
, _(
"Line Wrapping (Y or N)->"));
406 else if (c ==
'n' || c ==
'N')
417 _(
"Tabstop Colums Currently %d:"), view
->tab_stop);
421 if (i >= 1 && i <= 12) {
446 if (prev_search_cmd == 0) {
450 if (prev_search_cmd ==
'/') {
481 prev_search_cmd = search_cmd;
503 prev_search_cmd = search_cmd;
536 if (c ==
'@' || c ==
UIKEY_F09 || c ==
'\033')
537 if (c >=
'A' && c <=
'Z')
539 if (c <
'a' || c >
'z')
548 if (c ==
'@' || c ==
UIKEY_F09 || c ==
'\033')
550 if (c >=
'A' && c <=
'Z')
552 if (c <
'a' || c >
'z')
585 tfd = mkstemp(tmp_str);
642 e = getenv(
"DEFAULTEDITOR");
643 if (e ==
nullptr || *e ==
'\0')
649 _(
"View doesn't support editing current buffer directly"),
656 if (rc !=
'y' && rc !=
'Y')
664 if (bytes_written == 0) {
691 if (bytes_written == 0) {
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
738 UiSurface *sfc = view
->sfc;
745 if (i == 1 && !once) {
754 event
.y = event
.x = -1;
794 if (i < 32 && cmd_str[i] !=
'\0') {
808 if (i < 32 && cmd_str[i] !=
'\0') {
828 if (c <
'0' || c >
'9' || i == 32)
830 cmd_str[i++] = (
char)c;
836 if (c <
'0' || c >
'9' || i == 32)
839 if (cmd_str[0] ==
'\0') {
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
874 UiSurface *sfc = view
->sfc;
892 uint fcol = prompt_l + 1;
893 uint flen = view
->cols - prompt_l;
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
933 if (prompt_l > (view
->cols - 4) / 2)
945 if (prompt_l > (view
->cols - 4) / 2)
966 if (prompt_l > (view
->cols - 4) / 2)
980
981
982
983
984
986 ssize_t bytes_written = 0;
997 if (rc ==
'y' || rc ==
'Y')
1000 f_strip_ansi =
false;
1022 bytes_written += write(view
->out_fd, tmp_line_s, l);
1028 return bytes_written;
1031
1032
1043
1044
1045
1046void lp(View *view,
char *PrintFile) {
1047 char *print_cmd_ptr;
1048 char shell_cmd_spec[
MAXLEN];
1049 print_cmd_ptr = getenv(
"PRINTCMD");
1050 if (print_cmd_ptr ==
nullptr || *print_cmd_ptr ==
'\0')
1057
1058
1060
1061
1062
1063
1064
1065
1066
1067
1068
1069
1070
1071
1083
1084
1085
1086
1087
1088
1089
1090
1091
1092
1093
1094
1095
1096
1097
1098
1099
1100
1101
1102bool search(View *view,
int search_cmd,
char *regex_pattern) {
1105 regmatch_t pmatch[1];
1106 regex_t compiled_regex;
1113 memset(&mbstate, 0,
sizeof(mbstate));
1115 wchar_t wstr[2] = {L'\0', L'\0'};
1121 bool f_page =
false;
1122 UiSurface *sfc = view
->sfc;
1123 if (*regex_pattern ==
'\0')
1126 REG_FLAGS = REG_ICASE | REG_EXTENDED;
1128 REG_FLAGS = REG_EXTENDED;
1129 reti = regcomp(&compiled_regex, regex_pattern, REG_FLAGS);
1137 if (search_cmd ==
'/') {
1148 if (search_cmd ==
'/')
1159 if (search_cmd ==
'/') {
1174 compiled_regex.re_nsub + 1, pmatch, REG_FLAGS);
1175 if (reti == REG_NOMATCH) {
1178 if (search_cmd ==
'?')
1182 (search_cmd ==
'?' && view
->cury == 1)) {
1191 regerror(reti, &compiled_regex, err_str,
sizeof(err_str));
1201 if (search_cmd ==
'/') {
1211 if (search_cmd ==
'?')
1213 bool f_first_match =
true;
1219 match_idx = line_offset + pmatch[0].rm_so;
1220 match_len = pmatch[0].rm_eo - pmatch[0].rm_so;
1221 for (uint i = match_idx; i < match_idx + match_len; i++) {
1224 ui_get_cell(view->sfc, PAD, &cc, wstr, &attrs, &cpx,
nullptr);
1226 ui_set_cell(view->sfc, PAD, &cc, wstr, attrs, cpx,
nullptr);
1228 cc.channels = cell_nt_rev.channels;
1232 if (f_first_match) {
1233 f_first_match =
false;
1237 line_offset += pmatch[0].rm_eo;
1238 if (line_offset >= line_len)
1242 compiled_regex.re_nsub + 1, pmatch, REG_FLAGS);
1243 if (reti == REG_NOMATCH)
1247 regerror(reti, &compiled_regex, msgbuf,
sizeof(msgbuf));
1248 sprintf(tmp_str,
_(
"Regex match failed: %s"), msgbuf);
1253 if (search_cmd ==
'/') {
1257 }
else if (view
->cury == 1) {
1265 regfree(&compiled_regex);
1271
1272
1274
1275
1276
1277
1278
1279
1286 uint scroll, avail, scroll_this_line;
1290 while (scroll > 0) {
1310 scroll_this_line =
min(scroll, avail);
1311 scroll -= scroll_this_line;
1337
1338
1339
1340
1341
1342
1343
1344
1345
1346
1347
1348
1360
1361
1362
1363
1368 UiSurface *sfc = view
->sfc;
1398
1399
1400
1401
1402
1403
1404
1405
1406
1407
1408
1409
1410
1411
1415 UiSurface *sfc = view
->sfc;
1436 ui_mvwadd_wchstr(sfc, PAD, view->cury, 0, (
struct nccell *)view->cmplx_buf);
1445
1446
1447
1448
1449
1450
1451
1452
1453
1456 UiSurface *sfc = view
->sfc;
1496
1497
1498
1499
1500
1501
1502
1504 UiSurface *sfc = view
->sfc;
1515
1516
1517
1518
1519
1520
1522 uint scroll, scroll_this_line, avail;
1524 UiSurface *sfc = view
->sfc;
1531 while (scroll > 0) {
1548 scroll_this_line =
min(scroll, avail);
1549 scroll -= scroll_this_line;
1564 while (scroll > 0) {
1584 scroll_this_line =
min(scroll, avail);
1585 scroll -= scroll_this_line;
1630 while (scroll > 0) {
1651
1652
1653
1654
1655
1656
1657
1659 uint scroll, avail, scroll_this_line;
1669 UiSurface *sfc = view
->sfc;
1687 while (scroll > 0) {
1709 scroll_this_line =
min(scroll, avail);
1710 scroll -= scroll_this_line;
1725 while (scroll > 0) {
1743 while (scroll > 0) {
1764 scroll_this_line =
min(scroll, avail);
1765 scroll -= scroll_this_line;
1781 while (scroll > 0) {
1800
1818 if (c ==
'\n' || c ==
'\0')
1834 if (c !=
'\n' && c !=
'\0')
1852
1853
1854
1855
1878
1879
1880
1881
1892
1893
1894
1895
1896
1897
1911
1912
1913
1914
1920
1921
1922
1923
1924
1925
1926
1927
1928
1929
1933 off_t prev_ln_no = 0;
1934 while (low <= high) {
1935 off_t guess = low + (high - low) / 2;
1936 if (view
->ln_tbl[guess] == position)
1938 if (view
->ln_tbl[guess] < position) {
1947
1948
1949
1950
1951
1952
1953
1966
1967
1968
1969
1970
1971
1972
1983
1984
1985
1986
1987
1988
1989
1990
1991
2012
2013
2014
2015
2016
2017
2018
2019
2020
2021
2022
2023
2057
2058
2059
2061
2062
2064
2065
2066
2067
2068
2076 rc = prefresh(view
->sfc->mwin[PAD],
2084 ssnprintf(em0, MAXLEN - 1
, _(
"%s:%d prefresh(view->sfc->mwin[WIN2], pminrow=%d, pmincol=%d, smaxrow=%d, smaxcol=%d) returned %d\n"),
2096
2097
2098
2099
2100
2101
2102
2103
2104
2105
2106
2107
2108
2111 uint i = 0, j = 0, x = 0;
2113 uint tab_spaces = 0;
2118 wchar_t wstr[2] = {L'\0', L'\0'};
2122 uint word_cells = 0;
2134 memset(&mbstate, 0,
sizeof(mbstate));
2146 while (in_str[i] !=
'\0') {
2148 if (in_str[i] ==
'\033') {
2149 if (in_str[i + 1] ==
'[') {
2150 len = strcspn(&in_str[i],
"mK ") + 1;
2151 memcpy(ansi_tok, &in_str[i], len + 1);
2152 ansi_tok[len] =
'\0';
2153 if (ansi_tok[0] ==
'\0') {
2158 if (len == 0 || in_str[i + len - 1] ==
' ') {
2161 }
else if (in_str[i + len - 1] ==
'K') {
2172 if (in_str[i] ==
' ' || in_str[i] ==
'-') {
2173 if (view
->wrap && (sl_cols + word_cols) > (sl_maxlen - 1))
2175 (in_str[i] ==
'-') ? (wstr[0] = L'-') : (wstr[0] = L' ');
2177 ui_set_cell(view->sfc, PAD, &cc, wstr, attrs, cpx,
nullptr);
2179 cmplx_buf[j++] = cc;
2181 sl_cols += word_cols + 1;
2183 sl_cells += word_cells + 1;
2189 if (in_str[i] ==
'\0') {
2191 if (sl_cols + word_cols + 1 > sl_maxlen - 1)
2193 sl_cols += word_cols;
2195 sl_cells += word_cells;
2200 if (in_str[i] ==
'\t') {
2202 if (view
->wrap && sl_cols + word_cols + tab_spaces > sl_maxlen - 1)
2206 ui_set_cell(view->sfc, PAD, &cc, wstr, attrs, cpx,
nullptr);
2207 for (uint z = 0; z < tab_spaces; z++) {
2209 cmplx_buf[j++] = cc;
2212 sl_cols += word_cols + tab_spaces;
2214 sl_cells += word_cells + tab_spaces;
2221 len = mbrtowc(wstr, &in_str[i], MB_CUR_MAX, &mbstate);
2227 char_width = wcwidth(wstr[0]);
2232 for (uint n = 1; n < char_width; n++)
2234 ui_set_cell(view->sfc, PAD, &cc, wstr, attrs, cpx,
nullptr);
2237 cmplx_buf[j++] = cc;
2240 word_cols += char_width;
2247 if (word_cols > 0) {
2248 if (sl_cols <= sl_maxlen) {
2254 sl_s = &sl_s[sl_cols];
2255 sl_cc = &sl_cc[sl_cells];
2257 sl_cols = word_cols;
2258 sl_cells = word_cells;
2263 while (sl_cols > sl_maxlen - 1) {
2264 uint safe_cells = 0;
2266 while (safe_cols < sl_maxlen && safe_cells < sl_cells) {
2270 ui_get_cell(view->sfc, PAD, &sl_cc[safe_cells], wstr_chk, &attr_chk, &cpx_chk,
nullptr);
2271 uint cw = wcwidth(wstr_chk[0]);
2272 if (safe_cols + cw > sl_maxlen)
2277 if (safe_cells == 0) {
2279 safe_cols = sl_maxlen;
2286 sl_s = &sl_s[safe_cells];
2287 sl_cc = &sl_cc[safe_cells];
2289 sl_cols -= safe_cols;
2290 sl_cells -= safe_cells;
2319 ui_set_cell(view->sfc, PAD, &cc, wstr,
WA_NORMAL, cpx,
nullptr);
2325
2326
2327
2328
2329
2330
2331
2336 memset(tmp_str, 0,
sizeof(tmp_str));
2339 ui_log(INFO,
"%s:", tmp_str);
2343
2344
2345
2346
2347
2348
2349
2350
2351
2356 memset(tmp_str, 0,
sizeof(tmp_str));
2361 ui_get_cell(view->sfc, PAD, &view
->cur.sl_cc[k][c], wstr, &attrs, &cpx,
nullptr);
2362 if (wstr[0] == L'\0')
2365 tmp_str[c] = (
char)wstr[0];
2367 ui_log(INFO,
"%s:", tmp_str);
2371
2372
2373
2374
2375
2376
2377
2381 ui_log(INFO,
"%s:", tmp_str);
2384
2385
2386
2387
2388
2389
2390
2396 memset(tmp_str, 0,
sizeof(tmp_str));
2403 ui_log(INFO,
"%s:", tmp_str);
2409
2410
2411
2412
2413
2414
2415
2416
2417
2418
2419
2420
2421
2422
2423
2424
2425
2426
2427
2428
2429
2430
2431
2432
2433
2434
2435
2436
2437
2438
2439
2440
2441
2442
2443
2444
2445
2446
2447
2448
2449
2450
2451
2452
2453
2454
2455
2456
2457
2458
2459
2460
2467 uint fg_clr, bg_clr;
2468 char *ansi_p = ansi_str + 2;
2473 tok = strtok((
char *)ansi_p,
";m");
2474 bool a_toi_error =
false;
2476 if (tok ==
nullptr || *tok ==
'\0')
2482 if (t0 ==
'3' || t0 ==
'4') {
2484 tok = strtok(
nullptr,
";m");
2485 if (tok !=
nullptr) {
2487 tok = strtok(
nullptr,
";m");
2488 if (tok !=
nullptr) {
2492 }
else if (*tok ==
'2') {
2493 tok = strtok(
nullptr,
";m");
2495 tok = strtok(
nullptr,
";m");
2497 tok = strtok(
nullptr,
";m");
2505 }
else if (t1 ==
'9') {
2510 }
else if (t1 >=
'0' && t1 <=
'7') {
2517 }
else if (t0 ==
'4') {
2525 }
else if (t0 ==
'0') {
2536 switch (
a_toi(tok
, &a_toi_error
)) {
2562 }
else if (len == 0) {
2567 tok = strtok(
nullptr,
";m");
2569 if (!a_toi_error && (fg_clr != fg || bg_clr != bg))
2574
2575
2576
2580 UiSurface *sfc = view
->sfc;
2596
2597
2598
2599
2600
2601
2602
2603
2604
2605
2606
2607
2608
2609
2610
2611
2612
2613
2614
2627 eargv[eargc++] = strdup(
"view");
2628 eargv[eargc++] = strdup(
"-N");
2629 eargv[eargc++] = strdup(tmp_str);
2630 eargv[eargc] =
nullptr;
2642
2643
2645
2646
2647
2648
2649
2650
2651
2652
2675 while (rc ==
false) {
2678 view
->in_fd = mkstemp(tmp_spec);
2689
2700 tmp_fp = fopen(tmp_spec,
"r");
2701 if (tmp_fp ==
nullptr) {
2710 fgets(tmp_str,
MAXLEN - 1, tmp_fp);
2720 if (rc ==
'y' || rc ==
'Y')
int popup_form(Init *, int, char **, uint, uint)
instantiate a form popup window
int popup_view(Init *, int, char **, uint, uint, uint, uint)
instantiate a view popup window
size_t rtrim(char *)
Trims trailing spaces from string s in place.
#define min(x, y)
min macro evaluates two expressions, returning least result
void ui_render()
Render the UI by updating panels and refreshing the display.
void ui_getyx(UiSurface *s, ss_t w, uint *lines, uint *cols)
Get the current cursor position within a window of a UI surface.
int ui_cursor_enable_yx(UiSurface *s, ss_t w, uint y, uint x, bool visible)
Enable or disable the cursor at a specific position within a UiSurface.
int ui_wscrl(UiSurface *s, ss_t w, int rows)
Scroll the contents of a UiSurface by a specified number of lines.
int ui_cursor_move(UiSurface *s, ss_t w, uint y, uint x)
Move the cursor to a specified position within a UiSurface.
void ui_surface_destroy(UiSurface *s)
Destroy a UiSurface, cleaning up its windows and panels.
int ui_border_title(UiSurface *sfc, const char *title)
Draw a box with a title around the specified window.
void ui_restore_wins()
Restore the state of all windows in the UI. This function refreshes the standard screen and all surfa...
void ui_get_screen_size(uint *lines, uint *cols)
Get the current screen size (number of lines and columns).
int ui_wclrtobot(UiSurface *s, ss_t w)
Set the style of a surface window.
int ui_top_surface(UiSurface *s, ss_t w)
Hide a UiSurface, making it invisible on the screen.
int ui_wclrtoeol(UiSurface *s, ss_t w)
Clear to the end of the line in a surface window.
int ui_bkgdset(UiSurface *s, ss_t w, const UiCell *cell)
Set the background for new content to be written to a specific window within a UiSurface.
void go_to_position(View *, long)
#define UIKEY_SCROLL_DOWN
int ui_get_event(UiSurface *s, ss_t w, UiChyron *chyron, UiEvent *ev, int timeout_ms)
Read input events.
RGB ui_xterm256_idx_to_rgb(uint idx)
Convert XTerm 256 color index to RGB.
int ui_pair_content(uint pair, uint *fg, uint *bg)
Get the foreground and background colors of a specified color pair.
uint ui_add_pair(uint fg, uint bg)
Add a new color pair to the UI, or retrieve the index of an existing pair.
int ui_color_from_rgb(RGB *rgb)
Convert RGB to curses color index, adding new color if necessary.
int ui_mvwadd_wchnstr(UiSurface *s, ss_t w, uint y, uint x, const UiCell *cmplx_buf, uint n)
Draw a complex character string at a specific position in a surface window, with a maximum length.
int ui_waddstr(UiSurface *s, ss_t w, const char *text)
Draw a text string in a surface window.
int ui_mvwaddch(UiSurface *s, ss_t w, uint y, uint x, const char c)
Draw a character in a surface window.
int ui_mvwadd_wchstr(UiSurface *s, ss_t w, uint y, uint x, const UiCell *cmplx_buf)
Draw a complex character string at a specific position in a surface window.
int ui_mvwaddstr(UiSurface *s, ss_t w, uint y, uint x, const char *text)
Draw a text string at a specific position in a surface window.
int ui_mvwadd_wch(UiSurface *s, ss_t w, uint y, uint x, const UiCell *cell)
Draw a complex character at a specific position in a surface window.
int ui_wadd_wchnstr(UiSurface *s, ss_t w, const UiCell *cmplx_buf, uint n)
Draw a complex character string in a surface window, with a maximum length.
void view_full_screen_resize(Init *)
Resize the full screen view and its components.
void view_boxwin_resize(Init *)
Resize the current window and its box.
char prev_regex_pattern[MAXLEN]
void get_line(View *, off_t)
void sync_pos(View *, off_t pos)
int cf_accept(UiSurface *sfc, ss_t w, char *accept_s, uint flin, uint fcol, uint flen)
Accepts input for a field in a C-Menu window.
int shell(char *)
Execute a shell command.
int full_screen_shell(char *)
Execute a shell command in full screen mode.
size_t strnz__cpy(char *, const char *, size_t)
safer alternative to strncpy
size_t strnz(char *, size_t)
terminates string at New Line, Carriage Return, or max_len
size_t ssnprintf(char *, size_t, const char *,...)
ssnprintf was designed to be a safer alternative to snprintf.
int str_to_args(char **, char *, uint)
Converts a string into an array of argument strings.
bool expand_tilde(char *, uint)
Replaces "~/" in string with the user's home directory.
char size_t strip_ansi(char *, char *)
Strips ANSI SGR escape sequences (ending in 'm') from string s to d.
bool mk_dir(char *dir)
If directory doesn't exist, make it.
size_t strnz__cat(char *, const char *, size_t)
safer alternative to strncat
size_t strnlf(char *, size_t)
terminates string with line feed
int a_toi(char *, bool *)
a safer alternative to atoi() for converting ASCII strings to integers.
bool str_subc(char *, char *, char, char *, uint)
Replaces "ReplaceChr" in "s" with "Withstr" in "d" won't copy more than "l" bytes to "d" Replaces all...
char * strerror__r(int errnum, char *buf, size_t buflen)
A thread-safe alternative to strerror() that writes the error message corresponding to errnum into th...
int destroy_argv(uint argc, char **argv)
Deallocates memory allocated for argument strings in argv.
bool base_name(char *, char *)
Returns the base name of a file specification.
int view_init_input(Init *init, char *file_name)
Initialize the input for the C-Menu View.
bool verify_spec_arg(char *, char *, char *, char *, uint)
Verify file specification argument.
int view_file(Init *)
Start view.
bool enter_file_spec(Init *, char *)
use form to enter a file specification
int write_view_buffer(Init *, bool)
Write buffer contents to files.
void lp(View *, char *)
Send File to Print Queue.
#define get_prev_char()
read the previous characater from the virtual fileThere is no need to track line numbers when moving ...
void cat_file(View *)
Concatenate File to Standard Output.
int get_cmd_arg(View *, char *)
Get Command Argument from User Input.
int view_cmd_processor(Init *)
Main Command Processing Loop for View.
int get_cmd_char(View *, off_t *)
Get Command Character from User Input.
void build_prompt(View *)
Build Prompt String.
#define get_next_char()
read the next characater from the virtual file
void go_to_percent(View *, uint)
Go to Percent of File.
off_t line_number(View *, off_t)
Get Line Number for a Given File Position.
void go_to_eof(View *)
Go to End of File.
void go_to_mark(View *, uint)
Go to Mark.
void page_prev(View *)
display previous page
void initialize_line_table(View *)
Initialize Line Table.
bool search(View *, int, char *)
Search for Regular Expression Pattern.
void destroy_line_table(View *)
Destroy Line Table.
int go_to_line(View *, off_t)
Go to Specific Line.
void page_next(View *)
Advance to Next Page.
void scroll_next(View *view, uint n)
Scroll Down by n Lines.
void increment_ln(View *)
Increment Line Index and Update Line Table.
void scroll_prev(View *view, uint n)
Move the view scope n lines toward the beginning of the file.
void sync_ln(View *, off_t ln_no)
Synchronize Line Table with Current File Position.
void log_cc_buf(View *)
Log Complex Character Buffer.
void log_split_lines(View *)
Log Split Lines.
void display_line(View *)
Display Line on Padparam View *view data structure.
int pad_refresh(View *)
Refresh Pad and Line Number Window.
void display_line_eod(View *)
Display End of Data.
int display_prompt(View *, char *)
Display Command Line Prompt.
void parse_ansi_str(char *, attr_t *, ushort *)
Parse ANSI SGR Escape Sequence.
void log_strnz(char *, uint)
Log String with Specified Length.
int fmt_line(View *)
Format Line for Display.
void display_split_line(View *)
Display Split Line on Pad.
void view_display_help(Init *)
Display View Help File.
void view_display_page(View *)
Display Current Page.
void log_stripped_line_out(View *)
Log Stripped Line Output.
int ui_perror(char *emsg_str)
Display a simple error message window or print to stderr.
int ui_answer_yn(char *msg0, char *msg1, char *msg2, char *msg3)
Accept a single letter answer.
int ui_display_error(char *msg0, char *msg1, char *msg2, char *msg3)
Display an error message window or print to stderr.
char * next_file_spec_ptr
UiCell cmplx_buf[PAD_COLS]
char stripped_line_out[PAD_COLS]
char cur_file_str[MAXLEN]
char line_out_s[PAD_COLS]