void del(FILE *args, OrthogonalList *list, fpos_t *position) { int size; /* holds size of next token */ if (fgetc(args) != ',') { printinstruction(args, position); printf("Invalid instruction format.\n"); return; } /* get last name */ size = nextsize(args) + 1; /* get last name size */ char last[size]; /* last name parameter */ fgets(last, size, args); /* get last name parameter */ if (fgetc(args) != ',') { printinstruction(args, position); printf("Invalid instruction format.\n"); return; } /* get first name */ size = nextsize(args) + 1; /* get first name size */ char first[size]; /* first name parameter */ fgets(first, size, args); if (fgetc(args) != ',') { printinstruction(args, position); printf("Invalid instruction format.\n"); return; } /* get middle initial */ char middle; /* middle initial parameter */ middle = fgetc(args); if (!isalpha(middle)) { if (middle != '\n' && middle != EOF) advance(args); /* advance file pointer if not newline */ middle = ' '; /* set to space for no middle initial */ } else { advance(args); } /* print instruction */ if (middle == ' ') printf("D,%s,%s,\n", last, first); else printf("D,%s,%s,%c\n", last, first, middle); int result; /* store result of list operation */ result = remove_node(list, last, first, middle); if (result) printf("%s\n", describe_orthogonal_list_error(result)); }
int main(int ac, char** av) { int n = 500000; /* mallocs in main. */ int n0; list_t* head; double begin; double end; double t = 2.5e-9; if (ac > 1) n = atoi(av[1]); n0 = n; head = new_list(NULL); printf("check starts\n"); begin = sec(); while (n > 0) { add(head, malloc(nextsize())); n -= 1; if ((n & 1) && !empty(head)) free(take_out_first(head)); } while (!empty(head)) free(take_out_first(head)); free(head); end = sec(); printf("check is ready\n"); printf("total = %1.3lf s\n", end-begin); printf("m+f = %1.3g s\n", (end-begin)/(2*n0)); printf("cy = %1.3lf s\n", ((end-begin)/(2*n0))/t); return 0; }
int main(int argc, char **argv) { int c; uint_t cursize; DIR *dirp; int i; int j; char name[NAME_MAX + 1]; struct stat stb; double stime; while ((c = getopt(argc, argv, "a:c:d:f:l:m:n:s:")) != -1) { switch (c) { case 'a': addval = (uint_t)atoi(optarg); break; case 'c': nchars = (uint_t)atoi(optarg); break; case 'd': directory = optarg; break; case 'f': firstsize = (uint_t)atoi(optarg); break; case 'l': lastsize = (uint_t)atoi(optarg); break; case 'm': mulval = atof(optarg); break; case 'n': ndirs = (uint_t)atoi(optarg); break; case 's': stats = (uint_t)atoi(optarg); break; case '?': default: usage(); exit(1); } } if (!addval && !mulval) mulval = 2.0; else if ((addval && mulval) || mulval < 0.0) { usage(); exit(1); } if (stats == 0) stats = 1; if (!directory) directory = "."; else { if (mkdir(directory, 0777) < 0 && errno != EEXIST) { perror(directory); exit(1); } if (chdir(directory) < 0) { perror(directory); exit(1); } } if (firstsize == 0) firstsize = DFL_FIRST_SIZE; else if (firstsize > MAX_DIR_SIZE) firstsize = MAX_DIR_SIZE; if (lastsize == 0) lastsize = DFL_LAST_SIZE; else if (lastsize > MAX_DIR_SIZE) lastsize = MAX_DIR_SIZE; if (lastsize < firstsize) lastsize = firstsize; minchars = hexchars(lastsize - 1); if (nchars < minchars) nchars = minchars; else if (nchars >= NAME_MAX + 1) nchars = NAME_MAX; if (ndirs > MAX_DIR_COUNT) ndirs = MAX_DIR_COUNT; if (ndirs < MIN_DIR_COUNT) ndirs = MIN_DIR_COUNT; dirchars = hexchars(ndirs); pfxchars = nchars - minchars; if (pfxchars) memset(&name[dirchars + 1], 'a', pfxchars); for (j = 0; j < ndirs; j++) { filename(0, j, name); name[dirchars] = '\0'; mkdir(name, 0777); } for (cursize = firstsize; cursize <= lastsize; cursize = nextsize(cursize)) { stime = now(); for (i = 0; i < cursize; i++) { for (j = 0; j < ndirs; j++) { filename((i + j) % cursize, j, name); close(creat(name, 0666)); } } for (i = 0; i < cursize * stats; i++) { for (j = 0; j < ndirs; j++) { filename((i + j) % cursize, j, name); stat(name, &stb); } } for (j = 0; j < ndirs; j++) { filename(0, j, name); name[dirchars] = '\0'; dirp = opendir(name); while (readdir(dirp)) continue; closedir(dirp); } for (i = 0; i < cursize; i++) { for (j = 0; j < ndirs; j++) { filename((i + j) % cursize, j, name); unlink(name); } } printf("%d %.3f\n", cursize, (now() - stime) * 1.0e3 / (cursize * ndirs)); } for (j = 0; j < ndirs; j++) { filename(0, j, name); name[dirchars] = '\0'; rmdir(name); } return 0; }
void query(FILE *args, OrthogonalList *list, fpos_t *position) { if (fgetc(args) != ',') { printinstruction(args, position); printf("Invalid instruction format.\n"); return; } int query_id; /* type of query */ int size; /* next token size */ char delim; /* holds actual delimiter character */ if (fscanf(args, "%d", &query_id) != 1) { /* get query type */ printinstruction(args, position); printf("Invalid instruction format.\n"); return; } delim = fgetc(args); if (delim != ',') { printinstruction(args, position); printf("Invalid instruction format.\n"); return; } if (query_id == QUERY_YEAR) { int begin, end; /* range parameters */ /* get begin year */ if (fscanf(args, "%d", &begin) != 1) { printinstruction(args, position); printf("Invalid instruction format.\n"); return; } delim = fgetc(args); if (delim != ',') { printinstruction(args, position); printf("Invalid instruction format.\n"); return; } /* get end year */ if (fscanf(args, "%d", &end) != 1) { printinstruction(args, position); printf("Invalid instruction format.\n"); return; } /* print instruction */ printf("Q,%d,%d,%d\n", query_id, begin, end); if (begin < 0 || end < 0) { printf("Invalid arguments: Year parameters must be positive\n"); return; } unsigned int result = query_year(list, begin, end); /* call function */ char *msg; /* output string */ if (result == 1) { msg = " student was admitted from "; } else { msg = " students were admitted from "; } /* print output*/ printf("%u%s%d through %d.\n", result, msg, begin, end); advance(args); } else if (query_id == QUERY_MAJOR) { size = nextsize(args) + 1; /* get size */ char major[size]; /* query parameter */ fgets(major, size, args); /* get parameter */ /* print instruction */ printf("Q,%d,%s\n", query_id, major); nodeptr result = query_major(list, major); /* query & store result */ /* print result */ printf("The students studying %s are:\n", major); if (result == NULL) { printf("There are no students studying %s.\n", major); } else { while (result != NULL) { printf("%s, ", result->lastname); printf("%s", result->firstname); if (result->middle != ' ') printf(", %c\n", result->middle); else printf("\n"); result = result->next_by_major; } } advance(args); } else if (query_id == QUERY_HOMETOWN) { size = nextsize(args) + 1; /* get size */ char hometown[size]; /* query parameter */ fgets(hometown, size, args);/* get parameter */ /* print instruction */ printf("Q,%d,%s\n", query_id, hometown); /* make query and store result */ int year; /* last year of graduation */ nodeptr result = query_hometown(list, hometown, &year); /* print result header */ printf("The student(s) from %s with the latest expected ", hometown); printf("year of graduation:\n"); if (result == NULL) { printf("There are no students from %s\n", hometown); } else { do { printf("%s, ", result->lastname); printf("%s", result->firstname); if (result->middle != ' ') printf(", %c\n", result->middle); else printf("\n"); result = result->next_by_hometown; } while (result != NULL && result->graduation_year == year); } advance(args); } else { printinstruction(args, position); printf("Invalid instruction format.\n"); } }
void ins(FILE *args, OrthogonalList *list, fpos_t *position) { int size; /* stores length of next token */ if (fgetc(args) != ',') { printinstruction(args, position); printf("Invalid instruction format.\n"); return; } size = nextsize(args) + 1; /* get last name length */ char last[size]; /* last name parameter */ fgets(last, size, args); /* get last name */ if (fgetc(args) != ',') { printinstruction(args, position); printf("Invalid instruction format.\n"); return; } /* get first name */ size = nextsize(args) + 1; char first[size]; /* first name parameter */ fgets(first, size, args); if (fgetc(args) != ',') { printinstruction(args, position); printf("Invalid instruction format.\n"); return; } /* get middle initial */ size = nextsize(args) + 1; char middlename[size], middle; /* middle initial parameter */ fgets(middlename, size, args); middle = *middlename; if (middle == '\0') { /* if no middle initial store as space */ middle = ' '; } if ((!isalpha(middle) && middle != ' ') || fgetc(args) != ',') { printinstruction(args, position); printf("Invalid instruction format.\n"); return; } /* get major */ size = nextsize(args) + 1; char major[size]; /* major parameter */ fgets(major, size, args); if (fgetc(args) != ',') { printinstruction(args, position); printf("Invalid instruction format.\n"); return; } /* get year admitted */ size = nextsize(args) + 1; char admitted[size]; /* year admitted parameter */ fgets(admitted, size, args); if (fgetc(args) != ',') { printinstruction(args, position); printf("Invalid instruction format.\n"); return; } /* get graduation year */ int graduates; /* graduation year parameter */ fscanf(args, "%d", &graduates); if (fgetc(args) != ',') { printinstruction(args, position); printf("Invalid instruction format.\n"); return; } if (atoi(admitted) < 0 || graduates < 0) { printinstruction(args, position); printf("Years must be positive.\n"); return; } /* get hometown */ size = nextsize(args) + 1; char hometown[size]; /* hometown parameter */ fgets(hometown, size, args); /* print instruction */ if (middle == ' ') { printf("I,%s,%s,,%s,%s,%d,", last, first, major, admitted, graduates); printf("%s\n", hometown); } else { printf("I,%s,%s,%c,%s,%s,", last, first, middle, major, admitted); printf("%d,%s\n", graduates, hometown); } int result; /* get result of operation */ result = insert(list, last, first, middle, major, admitted, graduates, hometown); if (result) { printf("%s\n", describe_orthogonal_list_error(result)); } /* advance file pointer to next line */ advance(args); }