--- freem/src/routine.c 2025/04/30 17:19:16 1.8 +++ freem/src/routine.c 2025/04/30 20:03:09 1.9 @@ -1,5 +1,5 @@ /* - * $Id: routine.c,v 1.8 2025/04/30 17:19:16 snw Exp $ + * $Id: routine.c,v 1.9 2025/04/30 20:03:09 snw Exp $ * Routine buffer management * * @@ -24,6 +24,9 @@ * along with FreeM. If not, see . * * $Log: routine.c,v $ + * Revision 1.9 2025/04/30 20:03:09 snw + * Work on entryref parser + * * Revision 1.8 2025/04/30 17:19:16 snw * Improve backtraces in debugger * @@ -1178,44 +1181,87 @@ char *m_text(char *lref, char *buf) } -#if 0 -char *routine_get_line(char *lref, char *buf) + +/* routine_get_line() + * char *entryref: [cstr/in] M entryref + * char *buf: [cstr/out] buffer to contain resulting line + * + * returns a pointer to buf [cstr] on success; otherwise NULL */ +char *routine_get_line(char *entryref, char *buf) { char tmp[STRLEN]; char a[STRLEN]; long l1, rouoldc; short reload = FALSE; - int f = 3; + char f; + register int i; register int j; - - i = 0; - - if (f > 1) { - stcpy (tmp, lref[arg + 1]); - i = intexpr (tmp); - } - - if (a[0] == EOL) { - if (i < 0) { - return (char *) NULL; - } - - /* $T(+0) returns routine name */ - if (i == 0) { + char *routine_p; + char *label_p; + char *offset_p; + + short have_label = FALSE; + short have_offset = FALSE; + + char r[256]; + char l[256]; + char o[256]; + int os; + + /* + * entryref can be: + * +0 (returns rou_name) + * label + * ^routine + * +offset + * +offset^routine + * label^routine + * label+offset^routine + */ - if (f != 3) { - stcpy (a, rou_name); - } - else { - stcpy (a, argstck[arg + 2]); - } + /* handle +0 */ + if (strcmp (entryref, "+0") == 0) { + stcpy (buf, rou_name); + stcnv_m2c (buf); + return buf; + } - goto nxt_operator; + if ((routine_p = strchr (entryref, '^')) != NULL) { + /* have a routine */ + stcpy (r, routine_p); + printf ("routine = %s\r\n", r); + } + else { + /* no routine implies current routine */ + stcpy (r, rou_name); + } - } + if ((offset_p = strchr (entryref, '+')) != NULL) { + stcpy (o, offset_p + 1); + os = atoi (o); + sprintf (o, "%d\201\0", os); + printf ("offset = %s\r\n", o); + have_offset = TRUE; + } + else { + have_offset = FALSE; + } + return NULL; + i = 0; + + if (f > 1) { + stcpy (tmp, entryref); + i = intexpr (tmp); + } + + if (i < 0) return (char *) NULL; + + /* $T(+0) returns routine name */ + if (i == 0) { + stcpy (buf, rou_name); } if (f == 3) { @@ -1240,10 +1286,10 @@ char *routine_get_line(char *lref, char ierr -= NOPGM; /* smw 15 nov 2023 TODO HUH?? */ *a = EOL; - goto nxt_operator; + /*goto nxt_operator;*/ } - return; + return NULL; } @@ -1342,4 +1388,4 @@ t_end: } -#endif +