/** * 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" char* cleanstoc(CleanString s) { char* cs = calloc(sizeof(char), CleanStringLength(s) + 1); if (cs == NULL) return NULL; int i; for (i = 0; i < CleanStringLength(s); i++) cs[i] = CleanStringCharacters(s)[i]; cs[i] = '\0'; return cs; } /** * 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; pathchars = cleanstoc(path); modulechars = cleanstoc(module); if (modulechars == NULL || pathchars == NULL) { printf("Couldn't allocate memory\n"); exit(-1); } // Build command: // cd "" && clm -ms -o char cmd[64] = "cd \""; snprintf(cmd, 64, "cd \"%s\" && clm -ms -nw %s -o %s", pathchars, modulechars, modulechars); free(pathchars); free(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); free(execchars); }