#include <stdio.h>
+#include <stdbool.h>
+#include <stdlib.h>
+#include <signal.h>
+#include <string.h>
+#include <unistd.h>
+#include <stdint.h>
#include "mTaskSymbols.h"
+#define MAXTASKS 5
+#define MAXTASKSIZE 1024
+#define MAXSDS 50
#define STACKSIZE 1024
-#define PROGRAMSIZE 1024
#define DEBUG
#ifdef DEBUG
#define debug(s, ...) ;
#endif
-#define die(s, ...) {fprintf(stderr, s, ##__VA_ARGS__); return 1;}
+#define pdie(s) {perror(s); exit(1);}
+#define die(s, ...) {fprintf(stderr, s, ##__VA_ARGS__); exit(1);}
-char program[PROGRAMSIZE+1] = {0};
-int stack[STACKSIZE+1] = {0};
+char tasks[MAXTASKS][MAXTASKSIZE] = {0};
+
+void killHandler(int i)
+{
+ printf("%s caught, Bye...\n", strsignal(i));
+ exit(1);
+}
+
+bool input_available(int fd){
+ struct timeval tv;
+ fd_set fds;
+ tv.tv_sec = 0;
+ tv.tv_usec = 0;
+ FD_ZERO(&fds);
+ FD_SET(fd, &fds);
+ if(select(fd+1, &fds, NULL, NULL, &tv) == -1){
+ pdie("select");
+ }
+ return FD_ISSET(fd, &fds);
+}
int main(void)
{
- char c;
- int pl, sp, pc;
+ uint8_t c;
+// char taskindex = 0;
+// int pl, sp, pc;
+//
+ int fd_in = 0;
+ int next_free_new_task = 0;
+ uint16_t tasklen = 0;
+
+ //Register signal handler
+ if(signal(SIGINT, killHandler) == SIG_ERR){
+ die("Couldn't register signal handler...\n");
+ }
+ if(signal(SIGTERM, killHandler) == SIG_ERR){
+ die("Couldn't register signal handler...\n");
+ }
+
+ while(true){
+ if(input_available(fd_in)){
+ printf("Receiving input\n");
+ read(fd_in, &c, 1);
+ if((char) c == 's'){
+ debug("Receiving an sds\n");
+ } else if((char) c == 't'){
+ read(fd_in, &c, 1);
+ tasklen = 256*c;
+ read(fd_in, &c, 1);
+ tasklen += c;
+ if(tasklen > MAXTASKSIZE){
+ die("Task is too long: %d\n", tasklen);
+ }
+ for(int i = 0; i<tasklen; i++){
+ debug("Read %d\n", i);
+ read(fd_in, tasks[next_free_new_task]+i, 1);
+ read(fd_in, tasks[next_free_new_task]+i, 1);
+ debug("t[][%i]: %d\n", i, tasks[next_free_new_task][i]);
+ }
+ debug("Receiving a task of length %d\n", tasklen);
+ } else {
+ die("Unknown message: %c?\n", c);
+ }
+ exit(1);
+ }
+ usleep(1);
+ }
- //Read program
+/* //Read program
pc = 0;
while ((c = getchar()) != EOF && pc < PROGRAMSIZE)
program[pc++] = c;
sp = 0;
while(pc != pl){
switch(program[pc++]){
- case BCNop:;
+ case BCNOP:;
break;
- case BCPush:
+ case BCPUSH:
stack[sp++] = program[pc++];
break;
- case BCPop:
+ case BCPOP:
sp--;
break;
- case BCNot:
+ case BCNOT:
stack[sp] = stack[sp] > 0 ? 0 : 1;
break;
- case BCAdd:
+ case BCADD:
stack[sp-1] = stack[sp] + stack[sp-1];
sp -= 1;
break;
- case BCSub:
+ case BCSUB:
stack[sp-1] = stack[sp] - stack[sp-1];
sp -= 1;
break;
- case BCMul:
+ case BCMUL:
stack[sp-1] = stack[sp] * stack[sp-1];
sp -= 1;
break;
- case BCDiv:
+ case BCDIV:
stack[sp-1] = stack[sp] / stack[sp-1];
sp -= 1;
break;
- case BCAnd:
+ case BCAND:
stack[sp-1] = stack[sp] && stack[sp-1];
sp -= 1;
break;
- case BCOr:
+ case BCOR:
stack[sp-1] = stack[sp] || stack[sp-1];
sp -= 1;
break;
- case BCEq:
+ case BCEQ:
stack[sp-1] = stack[sp] == stack[sp-1];
sp -= 1;
break;
- case BCNeq:
+ case BCNEQ:
stack[sp-1] = stack[sp] != stack[sp-1];
sp -= 1;
break;
- case BCLes:
- stack[sp-1] = stack[sp] < stack[sp-1];
+ case BCLES: stack[sp-1] = stack[sp] < stack[sp-1];
sp -= 1;
break;
- case BCGre:
+ case BCGRE:
stack[sp-1] = stack[sp] > stack[sp-1];
sp -= 1;
break;
- case BCLeq:
+ case BCLEQ:
stack[sp-1] = stack[sp] <= stack[sp-1];
sp -= 1;
break;
- case BCGeq:
+ case BCGEQ:
stack[sp-1] = stack[sp] >= stack[sp-1];
sp -= 1;
break;
- case BCJmp:
+ case BCJMP:
pc = pc + program[pc];
break;
- case BCJmpT:
+ case BCJMPT:
pc += stack[sp] ? program[pc] : 1;
break;
- case BCJmpF:
+ case BCJMPF:
pc += stack[sp] ? 1 : program[pc];
break;
case BCSERIALAVAIL:
die("Unrecognized command: %X\n", program[--pc]);
}
}
+*/
return 0;
}