version 1.1, 2025/05/19 01:08:12
|
version 1.5, 2025/05/20 14:36:06
|
Line 1
|
Line 1
|
|
|
/* |
/* |
* |
|
* $Id$ |
* $Id$ |
* Implementation of the ZEDIT command |
* Implementation of the ZEDIT command |
* |
* |
Line 26
|
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.5 2025/05/20 14:36:06 snw |
|
* Documentation updates; raise ZCMMND instead of NOSTAND for restricted_mode restrictions |
|
* |
|
* Revision 1.4 2025/05/19 21:29:29 snw |
|
* Add basic tab completion to direct mode |
|
* |
|
* Revision 1.3 2025/05/19 17:57:20 snw |
|
* Extend ZEDIT to create the specified routine if it does not yet exist |
|
* |
|
* Revision 1.2 2025/05/19 02:03:31 snw |
|
* Reverse-engineer and document argumented ZPRINT (thanks to D. Wicksell) |
|
* |
* Revision 1.1 2025/05/19 01:08:12 snw |
* Revision 1.1 2025/05/19 01:08:12 snw |
* Add ZEDIT command (properly this time) |
* Add ZEDIT command (properly this time) |
* |
* |
Line 35
|
Line 45
|
**/ |
**/ |
|
|
#include <string.h> |
#include <string.h> |
|
#include <stdio.h> |
#include <stdlib.h> |
#include <stdlib.h> |
#include <ctype.h> |
#include <ctype.h> |
#include "mpsdef.h" |
#include "mpsdef.h" |
Line 48 MRESULT cmd_zedit(MACTION *ra)
|
Line 59 MRESULT cmd_zedit(MACTION *ra)
|
char editor_command[PATHLEN]; |
char editor_command[PATHLEN]; |
char *tgt_editor; |
char *tgt_editor; |
short free_editor = FALSE; |
short free_editor = FALSE; |
|
FILE *fp; |
|
|
if (restricted_mode) { |
if (restricted_mode) { |
retval = NOSTAND; |
/* we never shell out in restricted mode */ |
|
retval = CMMND; |
goto done; |
goto done; |
} |
} |
|
|
if (rou_name[0] == EOL) { |
if (rou_name[0] == EOL) { |
|
/* there was no current routine */ |
retval = NOPGM; |
retval = NOPGM; |
goto done; |
goto done; |
} |
} |
Line 64 MRESULT cmd_zedit(MACTION *ra)
|
Line 78 MRESULT cmd_zedit(MACTION *ra)
|
NULLPTRCHK(tgt_editor,"cmd_zedit"); |
NULLPTRCHK(tgt_editor,"cmd_zedit"); |
|
|
snprintf (tgt_editor, STRLEN - 1, "/usr/bin/vi"); |
snprintf (tgt_editor, STRLEN - 1, "/usr/bin/vi"); |
|
|
|
/* had to allocate the editor path on the heap, |
|
so we need to free it later */ |
free_editor = TRUE; |
free_editor = TRUE; |
} |
} |
|
|
if (*codptr == SP || *codptr == EOL) { |
if (*codptr == SP || *codptr == EOL) { |
|
/* argumentless ZEDIT edits the current routine */ |
stcpy (tgt_routine, rou_name); |
stcpy (tgt_routine, rou_name); |
} |
} |
else { |
else { |
|
/* argumented ZEDIT edits a specified routine */ |
expr (NAME); |
expr (NAME); |
|
|
if (varnam[0] == '^') { |
if (varnam[0] == '^') { |
Line 94 MRESULT cmd_zedit(MACTION *ra)
|
Line 113 MRESULT cmd_zedit(MACTION *ra)
|
stcnv_m2c (tgt_routine); |
stcnv_m2c (tgt_routine); |
|
|
if ((rtn_get_path (tgt_routine, pth)) == FALSE) { |
if ((rtn_get_path (tgt_routine, pth)) == FALSE) { |
retval = NOPGM; |
/* the routine could not be found */ |
goto done; |
if ((fp = fopen (pth, "w")) == NULL) { |
|
retval = PROTECT; |
|
goto done; |
|
} |
|
|
|
fprintf (fp, "%s ; Created by FreeM Administrator\n QUIT\n", tgt_routine); |
|
fclose (fp); |
} |
} |
|
|
snprintf (editor_command, sizeof (editor_command) - 1, "%s %s", tgt_editor, pth); |
snprintf (editor_command, sizeof (editor_command) - 1, "%s %s", tgt_editor, pth); |
|
|
|
/* make the environment friendly to running external programs */ |
sig_attach (SIGUSR1, SIG_IGN); |
sig_attach (SIGUSR1, SIG_IGN); |
set_io (UNIX); |
set_io (UNIX); |
|
|
system (editor_command); |
system (editor_command); |
|
|
|
/* back into mumps */ |
set_io (MUMPS); |
set_io (MUMPS); |
sig_attach (SIGUSR1, &oncld); |
sig_attach (SIGUSR1, &oncld); |
|
|
retval = OK; |
retval = OK; |
|
codptr++; |
|
|
done: |
done: |
if (free_editor) free (tgt_editor); |
if (free_editor) free (tgt_editor); |