diff options
author | Camil Staps | 2015-07-07 23:07:03 +0200 |
---|---|---|
committer | Camil Staps | 2015-07-07 23:07:03 +0200 |
commit | 4262f03fd937965d1f655ae01747cc8d8fc280c2 (patch) | |
tree | 589d67920952557e11a21e4e1a73758e41974081 /compile.c | |
parent | Initial commit (diff) |
Initial commit
Diffstat (limited to 'compile.c')
-rw-r--r-- | compile.c | 115 |
1 files changed, 115 insertions, 0 deletions
diff --git a/compile.c b/compile.c new file mode 100644 index 0000000..3b92ed2 --- /dev/null +++ b/compile.c @@ -0,0 +1,115 @@ +/** + * Interactive Clean + * + * C functions to compile and run a Clean module + * + * The MIT License (MIT) + * + * Copyright (c) 2015 Camil Staps <info@camilstaps.nl> + * + * 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 <stdlib.h> +#include <stdio.h> +#include <inttypes.h> +#include <string.h> +#include "Clean.h" + +/** + * Compile a Clean module in a path + * + * This may fail (hard) when out of memory or when clm fails + * clm should be in $PATH + * + * @param CleanString path the path + * @param CleanString module the module + * + * @return void + */ +void 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<modulelength;i++) + modulechars[i] = CleanStringCharacters(module)[i]; + modulechars[i] = 0x00; + + for (i=0;i<pathlength;i++) + pathchars[i] = CleanStringCharacters(path)[i]; + pathchars[i] = 0x00; + + // cd to <path> + chdir(pathchars); + + // Build command: + // clm -ms <module> -o <module> + char cmd[64] = "clm -ms "; + strcat(cmd, modulechars); + strcat(cmd, " -o "); + strcat(cmd, modulechars); + + // Call clm + 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<execlength;i++) + execchars[i] = CleanStringCharacters(executable)[i]; + execchars[i] = 0x00; + + // Build & run command: + // <module> -nt + strcat(execchars, " -nt"); + system(execchars); +} |