|
DataMuseum.dkPresents historical artifacts from the history of: DKUUG/EUUG Conference tapes |
This is an automatic "excavation" of a thematic subset of
See our Wiki for more about DKUUG/EUUG Conference tapes Excavated with: AutoArchaeologist - Free & Open Source Software. |
top - metrics - downloadIndex: T m
Length: 5132 (0x140c) Types: TextFile Names: »makeautomat.c«
└─⟦b20c6495f⟧ Bits:30007238 EUUGD18: Wien-båndet, efterår 1987 └─⟦this⟧ »EUUGD18/General/Gomoku/makeautomat.c«
# include "stdio.h" # define FOUND 1 # define NOT_FOUND 0 # define DUMMY 'd' empty(){ while(getchar() != '\n'); } fempty(fd) FILE *fd;{ while(getc(fd) != '\n'); } main(){ char text[128], uttext[128], c; char textarray[512][16]; int automat[512][3]; /* .=0 O=1 X=2 */ char pattern[4]; int offs, offset[3], point[3], threat[3]; int p[10], t[10], count, length; FILE *fd_in, *fd_out; int i, j, k; int flag; /* ********** Pass 1 ********************************************************* L{ser in en fil fr}n standard input med formatet: --------- | | | Block vilket inneh}ller po{ngdefenitioner. | | --------- | | | Block vilket inneh}ller m|nster vilka ger po{ng. | | --------- Utdata skrivs p} filen make_first och inneh}ller m|nster plus po{ng. *************************************************************************** */ printf("Pass 1\n"); for(i = 0; i < 10; i++){ scanf("%*c%d%d", &t[i], &p[i]); empty(); } fd_out = fopen("make_first", "w"); while(scanf("%s", text) != EOF){ if(text[0] == 0) continue; j = 0; for(i = 0; i < 3; i++){ offset[i] = 0; point[i] = 0; threat[i] = 0; } for(count = 0; text[count] != 0; count++); for(i = 0; text[i] !=0; i++){ if((text[i] == '.') || (text[i] == 'X')) uttext[i] = text[i]; else{ offset[j] = count - i - 1; threat[j] = t[text[i] - 'a']; point[j] = p[text[i] - 'a']; uttext[i] = '.'; j++; } } uttext[i] = 0; fprintf(fd_out, "%-10s%3d", uttext, j); for(i = 0; i < 3; i++) fprintf(fd_out,"%5d%3d%3d", offset[i], threat[i], point[i]); fprintf(fd_out,"\n"); } fclose(fd_out); /* ********** Pass 2 ********************************************************* L{ser filen make_first samt l{gger till motsvarande m|nster med O i st}llet f|r X. *************************************************************************** */ printf("Pass 2\n"); fd_in = fopen("make_first", "r"); fd_out = fopen("make_temp1", "w"); while((fscanf(fd_in, "%c", &c)) != EOF) if(c == 'X') fprintf(fd_out, "O"); else fprintf(fd_out, "%c", c); fclose(fd_in); fclose(fd_out); system("cat make_first make_temp1 > make_temp2"); system("mv make_temp2 make_first"); system("rm make_temp1"); /* ********** Pass 3 ********************************************************* L{ser filen make_first samt l{gger till delm|nster vilka leder till m|nstren. Om delm|nstret redan finns skall det ej l{ggas till. D.v.s inga kopior skall uppst}. Delm|nstren ges po{ng noll. Filen sorteras. *************************************************************************** */ printf("Pass 3\n"); fd_in = fopen("make_first", "r"); length = 0; while((fscanf(fd_in, "%s", textarray[length])) != EOF){ length++; fempty(fd_in); } count = length; fclose(fd_in); fd_out = fopen("make_first", "a"); for(i = 0; i < count; i++){ strcpy(text, textarray[i]); for(; text[0] != 0; text[strlen(text) - 1] = 0){ flag = NOT_FOUND; for(j = 0; j < length; j++) if(!strcmp(text, textarray[j])){ flag = FOUND; break; } if(flag == NOT_FOUND){ strcpy(textarray[length++], text); fprintf(fd_out, "%-10s%3d", text, 0); for(k = 0; k < 3; k++) fprintf(fd_out, "%5d%3d%3d", 0, 0, 0); fprintf(fd_out, "\n"); length++; } } } fclose(fd_out); system("sort make_first -o make_sort"); /* ********** Pass 4 ********************************************************* Det sista passet vilket konstruerar automaten samt g|r om filen till en c-fil med namnet automat.c. *************************************************************************** */ printf("Pass 4\n"); fd_in = fopen("make_sort", "r"); strcpy(textarray[0], ""); length = 1; while((fscanf(fd_in, "%s", textarray[length])) != EOF){ length++; fempty(fd_in); } strcpy(pattern, ".OX"); for(i = 0; i < length; i++){ strcpy(text, textarray[i]); for(j = strlen(text) + 1; j < 20; j++) text[j] = 0; text[strlen(text)] = DUMMY; for(j = 0; j < 3; j++){ text[strlen(text) - 1] = pattern[j]; flag = NOT_FOUND; for(offs = 0; offs < 11; offs++){ for(k = 0; k < length; k++) if(!strcmp(text + offs, textarray[k])){ flag = FOUND; automat[i][j] = k; break; } if(flag == FOUND) break; } if(flag == NOT_FOUND) printf("Cant find %s\n", text); } } fclose(fd_in); fd_in = fopen("make_sort", "r"); fd_out = fopen("make_automat", "w"); for(i = 0; i < 3; i++){ offset[i] = 0; point[i] = 0; threat[i] = 0; } count = 0; for(i = 0; i < length; i++){ fprintf(fd_out, "/*%3d %-10s*/", i, textarray[i]); fprintf(fd_out, "%3d,%3d,%3d,", automat[i][0], automat[i][1], automat[i][2]); fprintf(fd_out, "%5d,", count); for(j = 0; j < 3; j++) fprintf(fd_out, "%4d,%3d,%3d,", offset[j], threat[j], point[j]); fprintf(fd_out, "\n"); fscanf(fd_in, "%*s%d", &count); for(j = 0; j < 3; j++) fscanf(fd_in, "%d%d%d\n", &offset[j], &threat[j], &point[j]); } fprintf(fd_out, "};\n"); fclose(fd_in); fclose(fd_out); system("cat make_header make_automat | sed 's/ 0,/ __/g' > automat.c"); system("rm make_first make_sort make_automat"); }