Do all input through one ReadLine() routine
authorH.G.Muller <hgm@hgm-xboard.(none)>
Thu, 6 Dec 2018 20:23:49 +0000 (21:23 +0100)
committerH.G.Muller <hgm@hgm-xboard.(none)>
Thu, 6 Dec 2018 20:23:49 +0000 (21:23 +0100)
Some duplicate code now is made into a subroutine, to which we pass
the stream from which it should read a line, and the buffer to hold
the result. It returns whether the read was succesful (i.e. no EOF).
As this can also easily fake engine output from a file, the special
routine GetChar()we had for this could be abolished.

UCI2WB.c

index 178cdcb..c0ace0f 100644 (file)
--- a/UCI2WB.c
+++ b/UCI2WB.c
@@ -243,14 +243,11 @@ Move4GUI(char *m)
 }\r
 \r
 int\r
-GetChar()\r
+ReadLine (FILE *f, char *line)\r
 {\r
-    int c;\r
-    if(fromF) {\r
-       if((c = fgetc(fromF)) != EOF) return c;\r
-       fclose(fromF); fromF = 0; printf("# end fake\n");\r
-    }\r
-    return fgetc(fromE);\r
+    int x, i = 0;\r
+    while((x = fgetc(f)) != EOF && (line[i] = x) != '\n') i++; line[++i] = 0;\r
+    return (x != EOF);\r
 }\r
 \r
 void *\r
@@ -263,9 +260,8 @@ Engine2GUI()
        int i=0, x; char *p, dummy, len;\r
 \r
        fflush(stdout); fflush(toE);\r
-       while((line[i] = x = GetChar()) != EOF && line[i] != '\n') i++;\r
-       line[++i] = 0;\r
-       if(x == EOF) printf("tellusererror UCI2WB: %s died on me\n", binary), exit(0);\r
+       if(fromF && !ReadLine(fromF, line))  fromF = 0, printf("# end fake\n");\r
+       if(!fromF && !ReadLine(fromE, line)) printf("tellusererror UCI2WB: %s died on me\n", binary), exit(0);\r
        DPRINT("# engine said: %s", line), fflush(stdout);\r
        if(sscanf(line, "%s", command) != 1) continue;\r
        if(!strcmp(command, "bestmove")) {\r
@@ -440,7 +436,7 @@ GUI2Engine()
     char line[256], command[256], *p, *q, *r, mySide, type[99];\r
 \r
     while(1) {\r
-       int i, x, difficult, think=0;\r
+       int i, difficult, think=0;\r
 \r
        if((computer == stm || computer == ANALYZE && !searching) && !suspended) {\r
            DPRINT("# start search\n");\r
@@ -459,8 +455,7 @@ GUI2Engine()
       nomove:\r
        for(difficult=0; !difficult; ) { // read and handle commands that can (or must) be handled during thinking\r
        fflush(toE); fflush(stdout);\r
-       i = 0; while((x = getchar()) != EOF && (line[i] = x) != '\n') i++;\r
-       line[++i] = 0; if(x == EOF) { printf("# EOF\n"); sprintf(line, "quit -1\n"); }\r
+       if(!ReadLine(stdin, line)) printf("# EOF\n"), sprintf(line, "quit -1\n");\r
        if(think && !pause) Sync(PAUSE), think = 0, Release(); // if no longer thinking, take dummy pause\r
        sscanf(line, "%s", command); DPRINT("# '%s' think=%d pause=%d log=%d sent=%d\n", command, think, pause, logLen, sentLen);\r
        if(!strcmp(command, "usermove")) { difficult--; break; } // for efficiency during game play, moves, time & otim are tried first\r