extern "C" { #include <stdio.h> #include <string.h> #include <signal.h> } #include "muddle.h" int conn::update_buf(void) { static char tempbuf[1024]; extern auton *First_auton; extern int Target; int n = read(fd, tempbuf, 1024); if(!n) return -1; if(n<0) return 0; tempbuf[n] = 0; // Check for autons if(fd) for(auton *a=First_auton; a; a=a->next) if(a->match(tempbuf, slot)) a->out(Target, slot); // If the circular buffer's right edge is to be overstepped... if(head+n >= bufsize) { if(head < bufsize) strncpy(&buf[head], tempbuf, bufsize-head); memcpy(buf, &tempbuf[bufsize-head], n-bufsize+head); int temp = head; head = (head + n) % bufsize; if(tail > temp || tail <= head) tail = head+1; } // Otherwise, just copy it in. else { memcpy(&buf[head], tempbuf, n); if(tail > head && tail <= (head+n)) tail = head+n+1; head += n; } return 0; } void conn::output_buf(void) { // If we don't have to wrap-around the buffer, just output if(head > tail) { write(1, &buf[tail], head-tail); tail = head; } // Otherwise, output in two parts. else if(head < tail) { write(1, &buf[tail], bufsize-tail); write(1, buf, head); tail = head; } } int conn::check_command(char *str) { if(head == tail) return 0; int j=0; if(head > tail) { for(int i=tail; i<head; i++) { str[j++] = buf[i]; if(buf[i] == '\n') { str[j] = 0; tail = i+1; return 1; } } } else { for(int i=tail; i<bufsize; i++) { str[j++] = buf[i]; if(buf[i] == '\n') { str[j] = 0; tail = (i+1)%bufsize; return 1; } } for(i=0; i<head; i++) { str[j++] = buf[i]; if(buf[i] == '\n') { str[j] = 0; tail = i+1; return 1; } } } }