|
|
| version 1.23, 2025/05/06 16:10:06 | version 1.27, 2025/05/19 21:29:29 |
|---|---|
| Line 24 | Line 24 |
| * along with FreeM. If not, see <https://www.gnu.org/licenses/>. | * along with FreeM. If not, see <https://www.gnu.org/licenses/>. |
| * | * |
| * $Log$ | * $Log$ |
| * Revision 1.27 2025/05/19 21:29:29 snw | |
| * Add basic tab completion to direct mode | |
| * | |
| * Revision 1.26 2025/05/19 02:03:31 snw | |
| * Reverse-engineer and document argumented ZPRINT (thanks to D. Wicksell) | |
| * | |
| * Revision 1.25 2025/05/18 18:15:38 snw | |
| * Add ZEDIT command for editing routines | |
| * | |
| * Revision 1.24 2025/05/14 12:22:04 snw | |
| * Further work on shared memory | |
| * | |
| * Revision 1.23 2025/05/06 16:10:06 snw | * Revision 1.23 2025/05/06 16:10:06 snw |
| * Add extra blank before readline call on NetBSD | * Add extra blank before readline call on NetBSD |
| * | * |
| Line 174 void rbuf_dump(void); | Line 186 void rbuf_dump(void); |
| short rbuf_slot_from_name(char *); | short rbuf_slot_from_name(char *); |
| short is_standard(void); | short is_standard(void); |
| #ifdef HAVE_LIBREADLINE | |
| char *m_commands[] = { | |
| "@", | |
| "!", | |
| "!!", | |
| "ablock", | |
| "astart", | |
| "astop", | |
| "aunblock", | |
| "break", | |
| "close", | |
| "do", | |
| "else", | |
| "for", | |
| "goto", | |
| "halt", | |
| "hang", | |
| "if", | |
| "job", | |
| "kill", | |
| "ksubscripts", | |
| "kvalue", | |
| "lock", | |
| "merge", | |
| "new", | |
| "open", | |
| "quit", | |
| "read", | |
| "set", | |
| "tcommit", | |
| "then", | |
| "trollback", | |
| "tstart", | |
| "use", | |
| "view", | |
| "write", | |
| "xecute", | |
| "zassert", | |
| "zbreak", | |
| "zconst", | |
| "zedit", | |
| "zgoto", | |
| "zhalt", | |
| "zinsert", | |
| "zjob", | |
| "zload", | |
| "zmap", | |
| "znew", | |
| "zprint", | |
| "zquit", | |
| "zremove", | |
| "zsave", | |
| "zthrow", | |
| "ztrap", | |
| "zunmap", | |
| "zwatch", | |
| "zwith", | |
| "zwrite", | |
| "ABLOCK", | |
| "ASTART", | |
| "ASTOP", | |
| "AUNBLOCK", | |
| "BREAK", | |
| "CLOSE", | |
| "DO", | |
| "ELSE", | |
| "FOR", | |
| "GOTO", | |
| "HALT", | |
| "HANG", | |
| "IF", | |
| "JOB", | |
| "KILL", | |
| "KSUBSCRIPTS", | |
| "KVALUE", | |
| "LOCK", | |
| "MERGE", | |
| "NEW", | |
| "OPEN", | |
| "QUIT", | |
| "READ", | |
| "SET", | |
| "TCOMMIT", | |
| "THEN", | |
| "TROLLBACK", | |
| "TSTART", | |
| "USE", | |
| "VIEW", | |
| "WRITE", | |
| "XECUTE", | |
| "ZASSERT", | |
| "ZBREAK", | |
| "ZCONST", | |
| "ZEDIT", | |
| "ZGOTO", | |
| "ZHALT", | |
| "ZINSERT", | |
| "ZJOB", | |
| "ZLOAD", | |
| "ZMAP", | |
| "ZNEW", | |
| "ZPRINT", | |
| "ZQUIT", | |
| "ZREMOVE", | |
| "ZSAVE", | |
| "ZTHROW", | |
| "ZTRAP", | |
| "ZUNMAP", | |
| "ZWATCH", | |
| "ZWITH", | |
| "ZWRITE", | |
| NULL | |
| }; | |
| char **command_completion(const char *, int, int); | |
| char *command_generator(const char *, int); | |
| char **command_completion(const char *text, int start, int end) | |
| { | |
| if (start > 0) return NULL; | |
| rl_attempted_completion_over = 1; | |
| return rl_completion_matches(text, command_generator); | |
| } | |
| char *command_generator(const char *text, int state) | |
| { | |
| static int list_index, len; | |
| char *name; | |
| if (!state) { | |
| list_index = 0; | |
| len = strlen(text); | |
| } | |
| while ((name = m_commands[list_index++])) { | |
| if (strncmp(name, text, len) == 0) { | |
| return strdup(name); | |
| } | |
| } | |
| return NULL; | |
| } | |
| #endif | |
| /* | /* |
| * xecline(): | * xecline(): |
| * typ (where to go on function entry): 1 = restart | * typ (where to go on function entry): 1 = restart |
| Line 261 next_line: /* entry point for n | Line 417 next_line: /* entry point for n |
| if (debug_mode) { | if (debug_mode) { |
| debug_mode = debugger (DEBENTRY_LINE, entryref); | debug_mode = debugger (DEBENTRY_LINE, entryref); |
| } | } |
| job_set_status (pid, JSTAT_INTERPRETER); | job_set_status (pid, JSTAT_INTERPRETER); |
| if (then_ctr > 0) { | if (then_ctr > 0) { |
| Line 5289 halt: | Line 5445 halt: |
| break; | break; |
| /* Z-COMMANDS */ | /* Z-COMMANDS */ |
| case ZEDIT: | |
| merr_raise (cmd_zedit (&ra)); | |
| MRESCHECK(ra); | |
| break; | |
| case ZGO: | case ZGO: |
| /* ZGO with arguments: same as GOTO but with BREAK on */ | /* ZGO with arguments: same as GOTO but with BREAK on */ |
| Line 5428 zgo: | Line 5589 zgo: |
| merr_raise (NOPGM); | merr_raise (NOPGM); |
| break; | break; |
| } /*error */ | } /* error */ |
| stcpy (varnam, rou_name); | stcpy (varnam, rou_name); |
| } | } |
| Line 5564 zgo: | Line 5725 zgo: |
| if (*codptr == EOL || *codptr == SP) { | if (*codptr == EOL || *codptr == SP) { |
| merr_raise (ARGLIST); | merr_raise (ARGLIST); |
| break; | break; |
| } /*error */ | } /* error */ |
| dosave[0] = EOL; | dosave[0] = EOL; |
| /* parse stringlit */ | /* parse strlit */ |
| expr (STRING); | expr (STRING); |
| if (merr () > OK) break; | if (merr () > OK) break; |
| Line 7279 direct_mode: | Line 7440 direct_mode: |
| int hist_idx; | int hist_idx; |
| HIST_ENTRY *hist_ent; | HIST_ENTRY *hist_ent; |
| rl_attempted_completion_function = command_completion; | |
| if (quiet_mode == FALSE) { | if (quiet_mode == FALSE) { |
| if (tp_level == 0) { | if (tp_level == 0) { |
| snprintf (fmrl_prompt, sizeof (fmrl_prompt) - 1, "\r\n%s.%s> ", shm_env, nsname); | snprintf (fmrl_prompt, sizeof (fmrl_prompt) - 1, "\r\n%s.%s> ", shm_env, nsname); |