Start adding binary output
This commit is contained in:
parent
1b7373b617
commit
33f19530d4
4
Makefile
4
Makefile
@ -1,4 +1,4 @@
|
||||
sourcefiles := $(shell find src/ -name *.c)
|
||||
sourcefiles := $(shell find src/impl/ -name *.c)
|
||||
|
||||
|
||||
all:
|
||||
@ -6,7 +6,7 @@ all:
|
||||
|
||||
build-main:
|
||||
mkdir -p dist/ && \
|
||||
gcc -o dist/bf2c ${sourcefiles}
|
||||
gcc -o dist/bf2c -I src/intf/ ${sourcefiles}
|
||||
|
||||
package:
|
||||
./scripts/package-bf2c.sh
|
||||
|
@ -1,39 +1,74 @@
|
||||
#include <stdio.h>
|
||||
#include <stdbool.h>
|
||||
#include <string.h>
|
||||
#include "popen2.h"
|
||||
|
||||
int is_arg(int ac, char **argv, char *arg) {
|
||||
if (ac < 2) {
|
||||
return 0;
|
||||
}
|
||||
for(int x=1; x < ac; x++) {
|
||||
if (0 == strcmp(argv[x], arg)) {
|
||||
if (ac < 2) return 0;
|
||||
for(int x=1; x < ac; x++)
|
||||
if (0 == strcmp(argv[x], arg))
|
||||
return x; // return position of arg
|
||||
}
|
||||
}
|
||||
return 0; // arg not present
|
||||
}
|
||||
|
||||
void addValueChange(FILE *out, char *variable, bool increment, int value) {
|
||||
if(increment) {
|
||||
if(value==1) fprintf(out, "++%s;", variable);
|
||||
else fprintf(out, "%s+=%d;", variable, value);
|
||||
if(value==1) fprintf(out, "++%s;\n", variable);
|
||||
else fprintf(out, "%s+=%d;\n", variable, value);
|
||||
} else {
|
||||
if(value==1) fprintf(out, "--%s;", variable);
|
||||
else fprintf(out, "%s-=%d;", variable);
|
||||
if(value==1) fprintf(out, "--%s;\n", variable);
|
||||
else fprintf(out, "%s-=%d;\n", variable);
|
||||
}
|
||||
}
|
||||
|
||||
int main(int argc, char **argv)
|
||||
{
|
||||
int main(int argc, char **argv) {
|
||||
FILE *in = stdin, *out = stdout;
|
||||
int a;
|
||||
int b;
|
||||
int c;
|
||||
int cellsize = 30000;
|
||||
bool optimise = false;
|
||||
bool binary = false;
|
||||
|
||||
if(is_arg(argc, argv, "-h") || is_arg(argc, argv, "--help")) {
|
||||
printf("=== bf2c ===\n");
|
||||
printf("Usage: bf2c [-o] [-b] [-f filename]\n");
|
||||
printf("\n");
|
||||
printf(" -o Optimise add, subtract and pointer operations\n");
|
||||
printf(" -b Compile generated C code to binary using gcc\n");
|
||||
printf(" -f filename Output to a file instead of stdout\n");
|
||||
return 0;
|
||||
}
|
||||
if(is_arg(argc, argv, "-o")) optimise = true;
|
||||
if(is_arg(argc, argv, "-b")) binary = true;
|
||||
|
||||
char *z = "a.out";
|
||||
int y=is_arg(argc, argv, "-f");
|
||||
if(y) {
|
||||
if(argc>y+1 && argv[y+1][0]!='-') {
|
||||
z = argv[y+1];
|
||||
} else {
|
||||
fprintf(stderr, "Argument '-f' requires a value to specific the filename");
|
||||
return 1;
|
||||
}
|
||||
out = fopen(z, "w");
|
||||
}
|
||||
|
||||
if(binary) {
|
||||
char *cmd = "gcc";
|
||||
char *ar[7] = {0};
|
||||
ar[0] = cmd;
|
||||
ar[1] = "-o";
|
||||
ar[2] = z;
|
||||
ar[3] = "-x";
|
||||
ar[4] = "c";
|
||||
ar[5] = "-";
|
||||
ar[6] = NULL;
|
||||
|
||||
int *fwd;
|
||||
popen2(ar,fwd,NULL);
|
||||
out = fdopen(*fwd, "w");
|
||||
}
|
||||
|
||||
fprintf(out,
|
||||
"#include <stdio.h>\n"
|
36
src/impl/popen2.c
Normal file
36
src/impl/popen2.c
Normal file
@ -0,0 +1,36 @@
|
||||
#include <stdio.h>
|
||||
#include <unistd.h>
|
||||
#include <stdlib.h>
|
||||
|
||||
#define READ 0
|
||||
#define WRITE 1
|
||||
|
||||
// omg thanks
|
||||
// https://stackoverflow.com/a/12788169/10719432
|
||||
pid_t popen2(char *const *command, int *infp, int *outfp) {
|
||||
int p_stdin[2], p_stdout[2];
|
||||
pid_t pid;
|
||||
|
||||
if (pipe(p_stdin) != 0 || pipe(p_stdout) != 0) return -1;
|
||||
|
||||
pid = fork();
|
||||
|
||||
if (pid < 0) return pid;
|
||||
else if (pid == 0) {
|
||||
close(p_stdin[WRITE]);
|
||||
dup2(p_stdin[READ], READ);
|
||||
close(p_stdout[READ]);
|
||||
dup2(p_stdout[WRITE], WRITE);
|
||||
|
||||
execvp(command[0], command);
|
||||
exit(1);
|
||||
}
|
||||
|
||||
if (infp == NULL) close(p_stdin[WRITE]);
|
||||
else *infp = p_stdin[WRITE];
|
||||
|
||||
if (outfp == NULL) close(p_stdout[READ]);
|
||||
else *outfp = p_stdout[READ];
|
||||
|
||||
return pid;
|
||||
}
|
3
src/intf/popen2.h
Normal file
3
src/intf/popen2.h
Normal file
@ -0,0 +1,3 @@
|
||||
#pragma once
|
||||
#include <unistd.h>
|
||||
pid_t popen2(char *const *command, int *infp, int *outfp);
|
Loading…
Reference in New Issue
Block a user