static struct gd_val *list_read(FILE *i, FILE *o, int *n) { struct gd_val *l = NULL; *n = 0; fprintf(o, "OK ready to receive list\n"); for (;;) { char *p = line_read(i); if (p == NULL || strcmp(p, ".") == 0) { free(p); break; } if (p[0] == '>') { char *t = strdup(p + 1); free(p); p = t; } l = gd_val_append(l, p, NULL); (*n)++; } return l; }
void ui_check_who_won() { char *line, *who_str = NULL; int who, len; if (!move_fout) return; fprintf (move_fout, "WHO_WON \n"); fflush (move_fout); line = line_read(move_fin); if (g_strncasecmp(line, "ACK", 3)) { // NAK ==> not implemented ui_gameover = FALSE; sb_set_score (""); return; } line += 4; line = g_strstrip(line); who_str = line; while(!isspace(*line) && *line) line++; while(isspace(*line)) line++; sb_set_score (line); if (!g_strncasecmp(who_str, "NYET", 4)) { ui_gameover = FALSE; return; } ui_stopped = TRUE; ui_gameover = TRUE; if (opt_logfile) fprintf(opt_logfile, "RESULT: %s\n", who_str); if (!state_gui_active) ui_cleanup(); sb_update (); if (game_single_player && !ui_cheated && !g_strncasecmp(who_str, "WON", 3)) { gboolean retval; retval = prefs_add_highscore (line, sb_get_human_time ()); if (retval) sound_play (SOUND_HIGHSCORE); else sound_play (SOUND_WON); if (game_levels) { GameLevel *next_level = game_levels; while (next_level->name) { if (next_level->game == opt_game) break; next_level++; } next_level++; if (next_level->name) menu_put_level (next_level->name); } } if (game_single_player && !ui_cheated && !g_strncasecmp(who_str, "LOST", 4)) sound_play (SOUND_LOST); }
static void uniq (void) { Line line1, line2; Line *prev = &line1; Line *next = &line2; line_read (prev); line_write (prev); while (!feof (stdin)) { line_read (next); if (!lines_match (prev, next)) { Line *tmp = prev; prev = next; next = tmp; line_write (prev); } } }
/* format into 1kb pages */ void format_page(char *out, FILE * f1, FILE * fi, int n) { int p = 0, i, j, l, oft, num, ps; struct line line; char path[L]; int *addr1; char *addr2; FILE *f; rewind(f1); sprintf(path, "%s.pages", out); mkdir(path, -1); chdir(path); for (i = 0; i < n; i = j) { ps = 4; oft = 0; num = 0; addr1 = (int *)((void *)buffer[1] + 1024 - 4); addr2 = (char *)buffer[1]; for (j = i; j < n; j++) { if (j % M == 0) { fseek(f1, j * S, SEEK_SET); fread(buffer[0], S, min(M, n - j), f1); } fseek(fi, buffer[0][j % M].p, SEEK_SET); line_read(fi, &line); l = strlen(line.s); if (ps + l + 8 <= 1024) { ps += l + 8; *--addr1 = oft; *--addr1 = l; memcpy(addr2, line.s, l); addr2 += l; oft += l; num++; } else break; } *(int *)((void *)buffer[1] + 1024 - 4) = num; memset(addr2, 0, 1024 - ps); sprintf(path, "%s.%07d", out, p++); f = fopen(path, "w"); fwrite(buffer[1], 1, 1024, f); fclose(f); } chdir(".."); }
static struct gd_val *obj_read(FILE *i, FILE *o) { struct gd_val *l = NULL; fprintf(o, "OK ready to receive object\n"); for (;;) { char *p = line_read(i); char *k; if (p == NULL || strcmp(p, ".") == 0) { free(p); break; } if (p[0] == '>') { char *t = strdup(p + 1); free(p); p = t; } k = p; p = line_read(i); if (p == NULL || strcmp(p, ".") == 0) { free(k); free(p); break; } l = gd_val_set(l, k, gd_val_new(p, NULL, NULL)); } return l; }
/* format into single file */ void format(FILE * fo, FILE * f1, FILE * fi, int n) { int p, j; struct line line; rewind(fo); rewind(f1); while (n) { p = min(n, M * (k + 1) * (db + 1)); fread(buffer[0], S, p, f1); for (j = 0; j < p; j++) { fseek(fi, buffer[0][j].p, SEEK_SET); line_read(fi, &line); line_write(fo, &line); } n -= p; } }
/* check if the file sorted */ int check(FILE * f) { int i; struct line line; struct record *now, *pre; rewind(f); now = &buffer[0][0]; pre = &buffer[0][1]; for (i = 0; !feof(f); i++) { line_read(f, &line); now->x = line.x; now->y = line.y; if (i && record_cmp(pre, now) > 0) { printf("%d ", i); return 0; } *pre = *now; } return 1; }
void cmdline(void) { char strout[100]; myStringPut("calling cmdline"); myNLPut(); unsigned int line; line = line_read(); sprintf(strout,"line=%u",line); myStringPut(strout); myNLPut(); if (line <= 10) { sprintf(strout,"WHITE detected"); myStringPut(strout); myNLPut(); } else { sprintf(strout,"BLACK detected"); myStringPut(strout); myNLPut(); } }
int main(int argc, char **argv) { int i, m, n, lim, chk, page_format; FILE *fi, *fo, *f1, *f2; /* print usage */ if (argc < 3) { printf("usage: %s <infile> <outfile> [options]\n", argv[0]); printf("options:\n"); printf(" -b <buffer-number> set buffer number, default and maximum value is 130\n"); printf(" -db enable double buffering\n"); printf(" -p output 1kb pages (task 2)\n"); printf(" -c check correctness when sort completed (debug)\n"); printf(" -l <record-number> sort first <record-number> records (debug)\n"); return -1; } /* get arguments */ k = K; lim = 0x7fffffff; db = chk = page_format = 0; for (i = 3; i < argc; i++) { if (!strcmp(argv[i], "-b")) { sscanf(argv[++i], "%d", &k); if (k > K) { fprintf(stderr, "error: too many buffer pages."); return -1; } } else if (!strcmp(argv[i], "-l")) { sscanf(argv[++i], "%d", &lim); } else if (!strcmp(argv[i], "-c")) { chk = 1; } else if (!strcmp(argv[i], "-db")) { db = 1; } else if (!strcmp(argv[i], "-p")) { page_format = 1; } } k = k / (db + 1) - 1; if (k < 2) { fprintf(stderr, "error: too few buffer pages."); return -1; } /* open files */ fi = fopen(argv[1], "rb+"); if (!fi) { fprintf(stderr, "error: file '%s' is not found.\n", argv[1]); return -1; } if (!page_format) { if (!strcmp(argv[1], argv[2])) { fprintf(stderr, "error: infile cannot be the same as outfile.\n"); return -1; } fo = fopen(argv[2], "wb+"); } f1 = tmpfile(); f2 = tmpfile(); /* confirm arguments */ printf("buffer pages: %d\n", (k + 1) * (db + 1)); printf("double buffering: %s\n", db ? "yes" : "no"); printf("output 1kb pages: %s\n", page_format ? "yes" : "no"); /* start timer */ time_t start = time(0); puts("sorting..."); /* init mutex, semaphore */ if (db) { for (i = 0; i <= K; i++) { pthread_mutex_init(&mutex[i], 0); sem_init(&sem[i], 0, 0); } } /* extract useful data, quick sort pages individualy */ struct line line; for (n = 0; !feof(fi) && n < lim;) { buffer[0][n % M].p = ftell(fi); line_read(fi, &line); buffer[0][n % M].x = line.x; buffer[0][n % M].y = line.y; n++; if (n % M == 0 || feof(fi) || n == lim) { int num = n % M ? n % M : M; qsort(buffer[0], num, S, record_cmp); fwrite(buffer[0], S, num, f1); } } /* merge sort */ if (db) merge_sort_db(f1, f2, 1, 0, n); else merge_sort(f1, f2, 1, 0, n); /* format from useful data to real data */ if (page_format) format_page(argv[2], f1, fi, n); else format(fo, f1, fi, n); /* stop timer */ time_t end = time(0); int sec = (int)difftime(end, start); printf("completed, time elapsed: %d min %d sec\n", sec / 60, sec % 60); /* check correctness */ if (chk) { printf("checking correctness: "); fflush(stdout); if (page_format ? check_page(argv[2]) : check(fo)) puts("yes"); else puts("no"); } /* close files */ fclose(f1); fclose(f2); fclose(fi); if (!page_format) fclose(fo); return 0; }
static void dialog(FILE *i, FILE *o) { int done = 0; while (!done) { char *cmd = line_read(i); if (cmd == NULL || strcmp(cmd, "bye") == 0) { done = 1; } else if (strcmp(cmd, "about") == 0) { obj_write(about, o, o); } else if (strcmp(cmd, "topic") == 0) { gd_set_get(topics, i, o); } else if (strcmp(cmd, "store_topic") == 0) { gd_set_store(topics, i, o); } else if (strcmp(cmd, "topics") == 0) { gd_set_list_write(topics, i, o); } else if (strcmp(cmd, "user") == 0) { gd_set_get(users, i, o); } else if (strcmp(cmd, "store_user") == 0) { gd_set_store(users, i, o); } else if (strcmp(cmd, "users") == 0) { gd_set_list_write(users, i, o); } else if (strcmp(cmd, "template") == 0) { gd_set_get(templates, i, o); } else if (strcmp(cmd, "store_template") == 0) { gd_set_store(templates, i, o); } else if (strcmp(cmd, "templates") == 0) { gd_set_list_write(templates, i, o); } else if (strcmp(cmd, "store_story") == 0) { gd_set_store_story(i, o); } else if (strcmp(cmd, "delete_story") == 0) { gd_set_delete(stories, i, o); } else if (strcmp(cmd, "story") == 0) { gd_set_get(stories, i, o); } else if (strcmp(cmd, "story_set") == 0) { gd_story_set(i, o); } else if (strcmp(cmd, "_dump") == 0) { FILE *f; f = fopen("dump.bin", "w"); dump(f); fclose(f); } else { fprintf(o, "ERROR %s command not found\n", cmd); } free(cmd); } }
static char *arg_read(FILE *i, FILE *o) { fprintf(o, "OK ready to receive argument\n"); return line_read(i); }