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)