version 1.23, 2025/05/06 16:10:06
|
version 1.31, 2025/05/20 18:07:41
|
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.31 2025/05/20 18:07:41 snw |
|
* Add completion to debugger |
|
* |
|
* Revision 1.30 2025/05/20 16:20:42 snw |
|
* Update ROUTINE SSVN after ZEDIT and ZSAVE |
|
* |
|
* Revision 1.29 2025/05/20 14:56:56 snw |
|
* Fix direct-mode interface to online help |
|
* |
|
* Revision 1.28 2025/05/20 14:36:06 snw |
|
* Documentation updates; raise ZCMMND instead of NOSTAND for restricted_mode restrictions |
|
* |
|
* 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 198 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", |
|
"events", |
|
"for", |
|
"goto", |
|
"halt", |
|
"hang", |
|
"history", |
|
"if", |
|
"job", |
|
"jobtab", |
|
"kill", |
|
"ksubscripts", |
|
"kvalue", |
|
"lock", |
|
"locktab", |
|
"merge", |
|
"new", |
|
"open", |
|
"quit", |
|
"rbuf", |
|
"rcl", |
|
"read", |
|
"set", |
|
"shmpages", |
|
"shmstat", |
|
"tcommit", |
|
"then", |
|
"trantab", |
|
"trollback", |
|
"tstart", |
|
"use", |
|
"view", |
|
"wh", |
|
"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 441 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 534 next0:
|
Line 714 next0:
|
if (ch == '!') { /* UNIXCALL */ |
if (ch == '!') { /* UNIXCALL */ |
|
|
if (restricted_mode) { |
if (restricted_mode) { |
merr_raise (NOSTAND); |
merr_raise (CMMND); |
goto err; |
goto err; |
} |
} |
|
|
Line 4537 use_socket:
|
Line 4717 use_socket:
|
if (k > MAXSEQ) goto open_socket; |
if (k > MAXSEQ) goto open_socket; |
|
|
if (restricted_mode) { |
if (restricted_mode) { |
merr_raise (NOSTAND); |
merr_raise (CMMND); |
goto err; |
goto err; |
} |
} |
|
|
Line 5289 halt:
|
Line 5469 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 5613 zgo:
|
merr_raise (NOPGM); |
merr_raise (NOPGM); |
|
|
break; |
break; |
} /*error */ |
} /* error */ |
|
|
stcpy (varnam, rou_name); |
stcpy (varnam, rou_name); |
} |
} |
Line 5446 zgo:
|
Line 5631 zgo:
|
} |
} |
|
|
zsave (varnam); |
zsave (varnam); |
|
ssvn_routine_update (); |
break; |
break; |
|
|
|
|
Line 5564 zgo:
|
Line 5750 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 5677 zgo:
|
Line 5863 zgo:
|
} |
} |
|
|
if ((*(beg + 1)) == EOL) break; |
if ((*(beg + 1)) == EOL) break; |
|
|
write_m (beg + 1); |
write_m (beg + 1); |
if (merr () > OK) break; |
if (merr () > OK) break; |
} |
} |
Line 7279 direct_mode:
|
Line 7465 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); |
Line 7316 direct_mode:
|
Line 7504 direct_mode:
|
char kb[20]; |
char kb[20]; |
char db[STRLEN]; |
char db[STRLEN]; |
|
|
snprintf (kb, sizeof (kb) - 1, "%%SYS.HLP\201"); |
snprintf (kb, sizeof (kb) - 1, "%%SYSHLP\201"); |
snprintf (db, STRLEN - 1, "\201"); |
snprintf (db, STRLEN - 1, "\201"); |
|
|
symtab (kill_sym, kb, db); |
symtab (kill_sym, kb, db); |