/** * Interactive Clean * * C functions to compile and run a Clean module * * The MIT License (MIT) * * Copyright (c) 2015 Camil Staps * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal * in the Software without restriction, including without limitation the rights * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell * copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in all * copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE * SOFTWARE. */ #include #include #include #include #include "Clean.h" /** * Compile a Clean module in a path * * This may fail (hard) when out of memory * clm should be in $PATH * * @param CleanString path the path * @param CleanString module the module * * @return int the result of clm */ int64_t compile(CleanString path, CleanString module) { char* pathchars, * modulechars; int pathlength, modulelength; // Copy from CleanString to normal char[] pathlength = CleanStringLength(path); modulelength = CleanStringLength(module); pathchars = calloc(sizeof(char), pathlength + 1); modulechars = calloc(sizeof(char), pathlength + 1); if (modulechars == NULL || pathchars == NULL) { printf("Couldn't allocate memory\n"); exit(-1); } int i; for (i=0;i chdir(pathchars); // Build command: // clm -ms -o char cmd[64] = "clm -ms -nw "; strcat(cmd, modulechars); strcat(cmd, " -o "); strcat(cmd, modulechars); // Call clm return system(cmd); } /** * Run an executable * * This may fail when out of memory, or when the executable fails * The file should be executable by the user * * @param CleanString executable the path to the executable * * @return void */ void run(CleanString executable) { char* execchars; int execlength; // Copy CleanString to char[] execlength = CleanStringLength(executable); execchars = calloc(sizeof(char), execlength + 1 + 4); if (execchars == NULL) { printf("Couldn't allocate memory\n"); exit(-1); } int i; for (i=0;i -nt strcat(execchars, " -nt"); system(execchars); }