plugin-script.c
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-2025 J. Marcel van der Veer [algol68g@xs4all.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
© 2002-2025 J.M. van der Veer (jmvdveer@xs4all.nl)
|