|
|
| version 1.1, 2025/05/19 01:08:12 | version 1.3, 2025/05/19 17:57:20 |
|---|---|
| Line 26 | Line 26 |
| * 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.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 41 |
| **/ | **/ |
| #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 55 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) { |
| /* we never shell out in restricted mode */ | |
| retval = NOSTAND; | retval = NOSTAND; |
| 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 74 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 109 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); |