--- freem/src/xecline.c 2025/04/30 17:19:16 1.20 +++ freem/src/xecline.c 2025/05/19 02:03:31 1.26 @@ -1,5 +1,5 @@ /* - * $Id: xecline.c,v 1.20 2025/04/30 17:19:16 snw Exp $ + * $Id: xecline.c,v 1.26 2025/05/19 02:03:31 snw Exp $ * freem interpreter proper * * @@ -24,6 +24,24 @@ * along with FreeM. If not, see . * * $Log: xecline.c,v $ + * 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 + * Add extra blank before readline call on NetBSD + * + * Revision 1.22 2025/05/05 14:53:17 snw + * Modify rpm spec to include documentation TODO + * + * Revision 1.21 2025/05/01 17:02:30 snw + * Further debugging improvements + * * Revision 1.20 2025/04/30 17:19:16 snw * Improve backtraces in debugger * @@ -199,6 +217,7 @@ int xecline(int typ) char *reeval_codptr; char reeval_code[512]; + char entryref[256]; int i; int j; @@ -249,9 +268,9 @@ int xecline(int typ) next_line: /* entry point for next command line */ if (debug_mode) { - debug_mode = debugger (DEBENTRY_LINE, codptr); + debug_mode = debugger (DEBENTRY_LINE, entryref); } - + job_set_status (pid, JSTAT_INTERPRETER); if (then_ctr > 0) { @@ -299,8 +318,9 @@ next_line: /* entry point for n codptr = code; next_cmnd: /* continue line entry point */ + getraddress (entryref, nstx); if (debug_mode) { - debug_mode = debugger (DEBENTRY_CMD, codptr); + debug_mode = debugger (DEBENTRY_CMD, entryref); } if (sigint_in_for) goto for_quit; @@ -4958,7 +4978,8 @@ open_socket: if (merr () > OK) break; } else { - halt:i = 0; +halt: + i = 0; } cleanup (); @@ -5277,6 +5298,11 @@ open_socket: break; /* Z-COMMANDS */ + case ZEDIT: + merr_raise (cmd_zedit (&ra)); + MRESCHECK(ra); + break; + case ZGO: /* ZGO with arguments: same as GOTO but with BREAK on */ @@ -5416,7 +5442,7 @@ zgo: merr_raise (NOPGM); break; - } /*error */ + } /* error */ stcpy (varnam, rou_name); } @@ -5552,11 +5578,11 @@ zgo: if (*codptr == EOL || *codptr == SP) { merr_raise (ARGLIST); break; - } /*error */ + } /* error */ dosave[0] = EOL; - /* parse stringlit */ + /* parse strlit */ expr (STRING); if (merr () > OK) break; @@ -6804,14 +6830,6 @@ err: stcpy (er_buf, errmes[merr ()]); stcnv_m2c (er_buf); - - /* - if (usermode == 1 && ztrap[nstx][0] == EOL && etrap[0] == '\0') { - debug_mode = TRUE; - debugger (DEBENTRY_ERROR, codptr); - } - */ - #if !defined(MSDOS) logprintf (FM_LOG_DEBUG, "xecline: interpreter error %d [%s]", ierr, er_buf); @@ -7286,7 +7304,11 @@ direct_mode: set_io (UNIX); job_set_status (pid, JSTAT_DIRECTMODE); - + +#if defined(__NetBSD__) + printf ("\r\n"); +#endif + /* readline() does its own malloc() */ fmrl_buf = readline (fmrl_prompt); @@ -7297,6 +7319,7 @@ direct_mode: goto halt; } + if (strlen (fmrl_buf) > 0) { add_history (fmrl_buf);