|
|
1 //! @file plugin-script.c 2 //! @author J. Marcel van der Veer 3 4 //! @section Copyright 5 //! 6 //! This file is part of Algol68G - an Algol 68 compiler-interpreter. 7 //! Copyright 2001-2026 J. Marcel van der Veer [algol68g@algol68genie.nl]. 8 9 //! @section License 10 //! 11 //! This program is free software; you can redistribute it and/or modify it 12 //! under the terms of the GNU General Public License as published by the 13 //! Free Software Foundation; either version 3 of the License, or 14 //! (at your option) any later version. 15 //! 16 //! This program is distributed in the hope that it will be useful, but 17 //! WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY 18 //! or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for 19 //! more details. You should have received a copy of the GNU General Public 20 //! License along with this program. If not, see [http://www.gnu.org/licenses/]. 21 22 //! @section Synopsis 23 //! 24 //! Plugin script builder routines. 25 26 #include "a68g.h" 27 #include "a68g-prelude.h" 28 #include "a68g-optimiser.h" 29 #include "a68g-options.h" 30 31 //! @brief Build shell script from program. 32 33 #if defined (BUILD_A68G_COMPILER) 34 35 void build_script (void) 36 { 37 BUFFER cmd; 38 BUFCLR (cmd); 39 announce_phase ("script builder"); 40 ABEND (OPTION_OPT_LEVEL (&A68G_JOB) == 0, ERROR_ACTION, NO_TEXT); 41 // Flatten the source file. 42 ASSERT (a68g_bufprt (cmd, SNPRINTF_SIZE, "%s.%s", HIDDEN_TEMP_FILE_NAME, FILE_SOURCE_NAME (&A68G_JOB)) >= 0); 43 FILE_T source = open (cmd, O_WRONLY | O_CREAT | O_TRUNC, A68G_PROTECTION); 44 ABEND (source == -1, ERROR_ACTION, cmd); 45 for (LINE_T *sl = TOP_LINE (&A68G_JOB); sl != NO_LINE; FORWARD (sl)) { 46 size_t len = strlen (STRING (sl)); 47 if (len == 0 || (STRING (sl))[len - 1] != NEWLINE_CHAR) { 48 ASSERT (a68g_bufprt (cmd, SNPRINTF_SIZE, "%s\n%d\n%s\n", FILENAME (sl), NUMBER (sl), STRING (sl)) >= 0); 49 } else { 50 ASSERT (a68g_bufprt (cmd, SNPRINTF_SIZE, "%s\n%d\n%s", FILENAME (sl), NUMBER (sl), STRING (sl)) >= 0); 51 } 52 WRITE (source, cmd); 53 } 54 ASSERT (close (source) == 0); 55 // Compress source and dynamic library. 56 ASSERT (a68g_bufprt (cmd, SNPRINTF_SIZE, "cp %s %s.%s", FILE_PLUGIN_NAME (&A68G_JOB), HIDDEN_TEMP_FILE_NAME, FILE_PLUGIN_NAME (&A68G_JOB)) >= 0); 57 int ret = system (cmd); 58 ABEND (ret != 0, ERROR_ACTION, cmd); 59 ASSERT (a68g_bufprt (cmd, SNPRINTF_SIZE, "tar czf %s.%s.tgz %s.%s %s.%s", HIDDEN_TEMP_FILE_NAME, FILE_GENERIC_NAME (&A68G_JOB), HIDDEN_TEMP_FILE_NAME, FILE_SOURCE_NAME (&A68G_JOB), HIDDEN_TEMP_FILE_NAME, FILE_PLUGIN_NAME (&A68G_JOB)) >= 0); 60 ret = system (cmd); 61 ABEND (ret != 0, ERROR_ACTION, cmd); 62 // Compose script. 63 ASSERT (a68g_bufprt (cmd, SNPRINTF_SIZE, "%s.%s", HIDDEN_TEMP_FILE_NAME, FILE_SCRIPT_NAME (&A68G_JOB)) >= 0); 64 FILE_T script = open (cmd, O_WRONLY | O_CREAT | O_TRUNC, A68G_PROTECTION); 65 ABEND (script == -1, ERROR_ACTION, cmd); 66 char *strop = ""; 67 if (OPTION_STROPPING (&A68G_JOB) == QUOTE_STROPPING) { 68 strop = "--run-quote-script"; 69 } else { 70 strop = "--run-script"; 71 } 72 ASSERT (a68g_bufprt (A68G (output_line), SNPRINTF_SIZE, "#! %s/a68g %s\n", BINDIR, strop) >= 0); 73 WRITE (script, A68G (output_line)); 74 ASSERT (a68g_bufprt (A68G (output_line), SNPRINTF_SIZE, "%s\n%s --verify \"%s\"\n", FILE_GENERIC_NAME (&A68G_JOB), optimisation_option (), PACKAGE_STRING) >= 0); 75 WRITE (script, A68G (output_line)); 76 ASSERT (close (script) == 0); 77 ASSERT (a68g_bufprt (cmd, SNPRINTF_SIZE, "cat %s.%s %s.%s.tgz > %s", HIDDEN_TEMP_FILE_NAME, FILE_SCRIPT_NAME (&A68G_JOB), HIDDEN_TEMP_FILE_NAME, FILE_GENERIC_NAME (&A68G_JOB), FILE_SCRIPT_NAME (&A68G_JOB)) >= 0); 78 ret = system (cmd); 79 ABEND (ret != 0, ERROR_ACTION, cmd); 80 ASSERT (a68g_bufprt (cmd, SNPRINTF_SIZE, "%s", FILE_SCRIPT_NAME (&A68G_JOB)) >= 0); 81 ret = chmod (cmd, (__mode_t) (S_IRUSR | S_IWUSR | S_IXUSR | S_IRGRP | S_IXGRP | S_IROTH | S_IXOTH)); // -rwx-r-xr-x 82 ABEND (ret != 0, ERROR_ACTION, cmd); 83 ABEND (ret != 0, ERROR_ACTION, cmd); 84 // Clean up. 85 ASSERT (a68g_bufprt (cmd, SNPRINTF_SIZE, "%s.%s.tgz", HIDDEN_TEMP_FILE_NAME, FILE_GENERIC_NAME (&A68G_JOB)) >= 0); 86 ret = remove (cmd); 87 ABEND (ret != 0, ERROR_ACTION, cmd); 88 ASSERT (a68g_bufprt (cmd, SNPRINTF_SIZE, "%s.%s", HIDDEN_TEMP_FILE_NAME, FILE_SOURCE_NAME (&A68G_JOB)) >= 0); 89 ret = remove (cmd); 90 ABEND (ret != 0, ERROR_ACTION, cmd); 91 ASSERT (a68g_bufprt (cmd, SNPRINTF_SIZE, "%s.%s", HIDDEN_TEMP_FILE_NAME, FILE_PLUGIN_NAME (&A68G_JOB)) >= 0); 92 ret = remove (cmd); 93 ABEND (ret != 0, ERROR_ACTION, cmd); 94 ASSERT (a68g_bufprt (cmd, SNPRINTF_SIZE, "%s.%s", HIDDEN_TEMP_FILE_NAME, FILE_SCRIPT_NAME (&A68G_JOB)) >= 0); 95 ret = remove (cmd); 96 ABEND (ret != 0, ERROR_ACTION, cmd); 97 } 98 99 //! @brief Load program from shell script . 100 101 void load_script (void) 102 { 103 BUFFER cmd; char ch; 104 BUFCLR (cmd); 105 announce_phase ("script loader"); 106 // Decompress the archive. 107 ASSERT (a68g_bufprt (cmd, SNPRINTF_SIZE, "sed '1,3d' < %s | tar xzf -", FILE_INITIAL_NAME (&A68G_JOB)) >= 0); 108 ABEND (system (cmd) != 0, ERROR_ACTION, cmd); 109 // Reread the header. 110 FILE_T script = open (FILE_INITIAL_NAME (&A68G_JOB), O_RDONLY); 111 ABEND (script == -1, ERROR_ACTION, cmd); 112 // Skip the #! a68g line. 113 ASSERT (io_read (script, &ch, 1) == 1); 114 while (ch != NEWLINE_CHAR) { 115 ASSERT (io_read (script, &ch, 1) == 1); 116 } 117 // Read the generic filename. 118 A68G (input_line)[0] = NULL_CHAR; 119 int k = 0; 120 ASSERT (io_read (script, &ch, 1) == 1); 121 while (ch != NEWLINE_CHAR) { 122 A68G (input_line)[k++] = ch; 123 ASSERT (io_read (script, &ch, 1) == 1); 124 } 125 A68G (input_line)[k] = NULL_CHAR; 126 ASSERT (a68g_bufprt (cmd, SNPRINTF_SIZE, "%s.%s", HIDDEN_TEMP_FILE_NAME, A68G (input_line)) >= 0); 127 FILE_INITIAL_NAME (&A68G_JOB) = new_string (cmd, NO_TEXT); 128 // Read options. 129 A68G (input_line)[0] = NULL_CHAR; 130 k = 0; 131 ASSERT (io_read (script, &ch, 1) == 1); 132 while (ch != NEWLINE_CHAR) { 133 A68G (input_line)[k++] = ch; 134 ASSERT (io_read (script, &ch, 1) == 1); 135 } 136 isolate_options (A68G (input_line), NO_LINE); 137 (void) set_options (OPTION_LIST (&A68G_JOB), A68G_FALSE); 138 ASSERT (close (script) == 0); 139 } 140 141 //! @brief Rewrite source for shell script . 142 143 void rewrite_script_source (void) 144 { 145 // Rebuild the source file. 146 ASSERT (remove (FILE_SOURCE_NAME (&A68G_JOB)) == 0); 147 FILE_T source = open (FILE_SOURCE_NAME (&A68G_JOB), O_WRONLY | O_CREAT | O_TRUNC, A68G_PROTECTION); 148 ABEND (source == -1, ERROR_ACTION, FILE_SOURCE_NAME (&A68G_JOB)); 149 for (LINE_T *ref_l = TOP_LINE (&A68G_JOB); ref_l != NO_LINE; FORWARD (ref_l)) { 150 WRITE (source, STRING (ref_l)); 151 size_t len = strlen (STRING (ref_l)); 152 if (len == 0 || (STRING (ref_l))[len - 1] != NEWLINE_CHAR) { 153 WRITE (source, NEWLINE_STRING); 154 } 155 } 156 // Wrap it up. 157 ASSERT (close (source) == 0); 158 } 159 160 #endif
© 2001-2026 J.M. van der Veer
jmvdveer@algol68genie.nl