canoncial mode fixes
[my-code/ivac.git] / src / input.c
index a2886ee..30f60b9 100644 (file)
@@ -18,50 +18,50 @@ int input_init(t_input *input) {
   }
   input->c_count=0;
 
-  tcgetattr(0,&tios);
-  /* switch off canonical mode */
-  tios.c_lflag&=(~ICANON);
-  tios.c_lflag&=(~ECHO);
-  tcsetattr(0,TCSANOW,&tios);
+  tcgetattr(0,&(input->tios));
+  tios=input->tios;
+
+  if(!(input->mode&LINE_BUFFERED)) {
+    tios.c_lflag&=(~ICANON);
+    tios.c_lflag&=(~ECHO);
+    tios.c_cc[VTIME]=0;
+    tios.c_cc[VMIN]=1;
+    tcsetattr(0,TCSANOW,&tios);
+  }
 
   return I_SUCCESS;
 }
 
 int input_shutdown(t_input *input) {
 
-  struct termios tios;
-
   free(input->content);
-
-  tcgetattr(0,&tios);
-  tios.c_lflag|=ICANON;
-  tios.c_lflag|=ECHO;
-  tcsetattr(0,TCSANOW,&tios);
-
+  tcsetattr(0,TCSANOW,&(input->tios));
   puts("[input] shutdown");
 
   return I_SUCCESS;
 }
 
-int input_get_char(t_input *input,int (*callback)(t_input *input,void *ptr),
+int input_get_event(t_input *input,int (*callback)(t_input *input,void *ptr),
                    void *ptr) {
 
-  char data[1];
+  char data[MAX_CONTENT];
+  int count;
+
+  /* delete char counter if not buffered */
+  if(!(input->mode&CONTENT_BUFFER)) input->c_count=0;
 
-  if(read(0,data,1)==-1) {
+  if((count=read(0,data,MAX_CONTENT))==-1) {
     perror("[input] read call");
     return I_ERROR;
   }
 
-  if(input->c_count==MAX_CONTENT) {
+  if(input->c_count>=MAX_CONTENT) {
     puts("[input] max input length reached");
     return I_ERROR;
   }
 
-  input->content[input->c_count]=data[0];
-  input->c_count++;
-
-  if(data[0]=='\n') input->c_count=0;
+  strncpy(&(input->content[input->c_count]),data,count);
+  input->c_count+=count;
 
   callback(input,ptr);