No more C++ includes.
authorFrancois Fleuret <francois@fleuret.org>
Fri, 30 Oct 2009 22:59:17 +0000 (18:59 -0400)
committerFrancois Fleuret <francois@fleuret.org>
Fri, 30 Oct 2009 22:59:17 +0000 (18:59 -0400)
breezed.cc

index 473e409..14809ac 100644 (file)
 
 */
 
-#include <fstream>
-#include <cmath>
 #include <stdio.h>
 #include <stdlib.h>
-
-#include <sys/types.h>
-#include <sys/stat.h>
 #include <fcntl.h>
 #include <errno.h>
+#include <unistd.h>
 #include <string.h>
 
+#define BUFFER_SIZE 4096
+
 using namespace std;
 
 const int major_version_number = 1;
@@ -316,22 +314,72 @@ Written by Francois Fleuret (francois@fleuret.org).\n",
   //////////////////////////////////////////////////////////////////////
 
   if(configuration_file) {
-    ifstream cf(configuration_file);
+    char raw_line[BUFFER_SIZE];
+    int start, end, eol, k;
+    FILE *file;
+
+    file = fopen(configuration_file, "r");
 
-    if(cf.fail()) {
-      fprintf(stderr, "Can not open %s for reading.\n", configuration_file);
+    if(!file) {
+      fprintf(stderr, "Can not open `%s' for reading.\n", configuration_file);
       exit(1);
     }
 
+    start = 0;
+    end = 0;
+
     char *s;
 
     int line_number = 0;
 
-    while(!cf.eof()) {
-      cf.getline(buffer, buffer_size);
+    while(end > start || !feof(file)) {
+      eol = start;
+
+      /* Look for the end of a line in what is already in the buffer */
+      while(eol < end && raw_line[eol] != '\n') eol++;
+
+      /* if we did not find the of a line, move what has not been
+         processed and is in the buffer to the beginning of the buffer,
+         fill the buffer with new data from the file, and look for the
+         end of a line */
+      if(eol == end) {
+        for(k = 0; k < end - start; k++) {
+          raw_line[k] = raw_line[k + start];
+        }
+        end -= start;
+        eol -= start;
+        start = 0;
+        end += fread(raw_line + end, sizeof(char), BUFFER_SIZE - end, file);
+        while(eol < end && raw_line[eol] != '\n') eol++;
+      }
+
+      /* The end of the line is the buffer size, which means the line is
+         too long */
+
+      if(eol == BUFFER_SIZE) {
+        raw_line[BUFFER_SIZE - 1] = '\0';
+        fprintf(stderr, "Selector: Line too long (max is %d characters):\n",
+                BUFFER_SIZE);
+        fprintf(stderr, raw_line);
+        fprintf(stderr, "\n");
+        exit(1);
+      }
+
+      /* If we got a line, we replace the carriage return by a \0 to
+         finish the string */
+
+      raw_line[eol] = '\0';
+
+      /* here we process the line */
+
       line_number++;
 
-      s = next_word(token, buffer, buffer_size);
+      if(debug) {
+        printf("%s:%d \"%s\"\n",
+               configuration_file, line_number, raw_line + start);
+      }
+
+      s = next_word(token, raw_line + start, buffer_size);
 
       if(strcmp(token, "thermal_files") == 0) {
         if(s == 0) {
@@ -374,7 +422,10 @@ Written by Francois Fleuret (francois@fleuret.org).\n",
                 token, configuration_file, line_number);
         exit(1);
       }
+
+      start = eol + 1;
     }
+
   }
 
   //////////////////////////////////////////////////////////////////////