int main(void) { size_t max = 100; size_t n = 20; char buf[strsiz]; size_t i; st_t st = st_init(max); for (i = 0; i < n; i++) { item_t t = newitem(randkey(), randstr(buf, strsiz)); st_insert(st, t); } st_sort(st, print); printf("\nThe item with key 11 is: "); print(st_search(st, 11)); printf("\nThe 4th smallest key is: "); print(st_select(st, 4)); st_delete(st, st_search(st, 11)); printf("\n delete the item with key 11.\n"); st_sort(st, print); /* delete all item */ while (!st_empty(st)) { item_t x = st_select(st, 0); printf("delete item: "); print(x); st_delete(st, st_select(st, 0)); } st_finalize(&st); return 0; }
/* main function takes a PLATYPUS source file as * an argument at the command line. * usage: platy source_file_name [-stz size][-sts:A | -sts:D] */ int main(int argc, char ** argv){ FILE *fi; /* input file handle */ int loadsize = 0; /*the size of the file loaded in the buffer */ int st_def_size = ST_DEF_SIZE; /* Sumbol Table default size */ char sort_st = 0; /*Symbol Table sort switch */ int ansi_c = !ANSI_C; /* ANSI C flag */ /* Check if the compiler option is set to compile ANSI C */ /* __DATE__, __TIME__, __LINE__, __FILE__, __STDC__ are predefined preprocessor macros*/ if(ansi_c){ err_printf("Date: %s Time: %s",__DATE__, __TIME__); err_printf("ERROR: Compiler is not ANSI C compliant!\n"); exit(1); } /*check for correct arrguments - source file name */ if (argc <= 1){ /* __DATE__, __TIME__, __LINE__, __FILE__ are predefined preprocessor macros*/ err_printf("Date: %s Time: %s",__DATE__, __TIME__); err_printf("Runtime error at line %d in file %s", __LINE__, __FILE__); err_printf("%s%s%s",argv[0],": ","Missing source file name."); err_printf("%s%s%s","Usage: ", "platy", " source_file_name [-stz size][-sts:A | -sts:D]"); exit(EXIT_FAILURE); } /* check for optional switches - symbol table size and/or sort */ if (argc == 3){ if (strcmp(argv[2],"-sts:A") && strcmp(argv[2],"-sts:D") ){ err_printf("%s%s%s",argv[0],": ","Invalid switch."); err_printf("%s%s\b\b\b\b%s","Usage: ", argv[0], " source file name [-stz size][-sts:A | -sts:D]"); exit(EXIT_FAILURE); } if(strcmp(argv[2],"-sts:A")) sort_st = 'D'; else sort_st = 'A'; } /* symbol table size specified */ if (argc == 4){ if (strcmp(argv[2],"-stz")){ err_printf("%s%s%s",argv[0],": ","Invalid switch."); err_printf("%s%s\b\b\b\b%s","Usage: ", argv[0], " source file name [-stz size][-sts:A | -sts:D]"); exit(EXIT_FAILURE); } /* convert the symbol table size */ st_def_size = atoi(argv[3]); if (st_def_size <= 0){ err_printf("%s%s%s",argv[0],": ","Invalid switch."); err_printf("%s%s\b\b\b\b%s","Usage: ", argv[0], " source file name [-stz size][-sts:A | -sts:D]"); exit(EXIT_FAILURE); } } if (argc == 5){ if (strcmp(argv[2],"-stz")){ err_printf("%s%s%s",argv[0],": ","Invalid switch."); err_printf("%s%s\b\b\b\b%s","Usage: ", argv[0], " source file name [-stz size][-sts:A | -sts:D]"); exit(EXIT_FAILURE); } /* convert the symbol table size */ st_def_size = atoi(argv[3]); if (st_def_size <= 0){ err_printf("%s%s%s",argv[0],": ","Invalid switch."); err_printf("%s%s\b\b\b\b%s","Usage: ", argv[0], " source file name [-stz size][-sts:A | -sts:D]"); exit(EXIT_FAILURE); } if (strcmp(argv[4],"-sts:A")&& strcmp(argv[4],"-sts:D") ){ err_printf("%s%s%s",argv[0],": ","Invalid switch."); err_printf("%s%s\b\b\b\b%s","Usage: ", argv[0], " source file name [-stz size][-sts:A | -sts:D]"); exit(EXIT_FAILURE); } if(strcmp(argv[4],"-sts:A")) sort_st = 'D'; else sort_st = 'A'; } /* create a source code input buffer - multiplicative mode */ sc_buf = b_create(INIT_CAPACITY,INC_FACTOR,'m'); if (sc_buf == NULL){ err_printf("%s%s%s",argv[0],": ","Could not create source buffer"); exit(EXIT_FAILURE); } /* create symbol table */ sym_table = st_create(st_def_size); if (!sym_table.st_size){ err_printf("%s%s%s",argv[0],": ","Could not create symbol table"); exit (EXIT_FAILURE); } /*open source file */ if ((fi = fopen(argv[1],"r")) == NULL){ err_printf("%s%s%s%s",argv[0],": ", "Cannot open file: ",argv[1]); exit (1); } /* load source file into input buffer */ printf("Reading file %s ....Please wait\n",argv[1]); loadsize = ca_load (fi,sc_buf); if(loadsize == R_FAIL_1) err_printf("%s%s%s",argv[0],": ","Error in loading buffer."); /* close source file */ fclose(fi); /*find the size of the file */ if (loadsize == LOAD_FAIL){ printf("The input file %s %s\n", argv[1],"is not completely loaded."); printf("Input file size: %ld\n", get_filesize(argv[1])); } /* pack and display the source buffer */ if(ca_pack(sc_buf)){ display(sc_buf); } /* create string Literal Table */ str_LTBL = b_create(INIT_CAPACITY,INC_FACTOR,'a'); if (str_LTBL == NULL){ err_printf("%s%s%s",argv[0],": ","Could not create string buffer"); exit(EXIT_FAILURE); } /*registrer exit function */ atexit(garbage_collect); /*Testbed for buffer, scanner,symbol table and parser*/ /* Initialize scanner input buffer scanner_init(sc_buf); */ line = 1; ca_addc(sc_buf, EOF); printf("\nParsing the source file...\n\n"); parser(sc_buf); /* print Symbol Table */ if(sym_table.st_size && sort_st){ st_print(sym_table); if(sort_st){ printf("\nSorting symbol table...\n"); st_sort(sym_table,sort_st); st_print(sym_table); } } return (EXIT_SUCCESS); /* same effect as exit(0) */ }/*end of main */