void btcmd(char* prompt_string,CMDENTRY app_cmds[], void(error_handler)(int)) { char* rlbuf = NULL; char* cp = NULL; static char cmdbuf[MAXBUFSZ+1]; int status = 0; if (input == NULL) input = stdin; current_app_cmds = app_cmds; cblk.function = NULL; while (status >= 0) { if (rlbuf != NULL) { free(rlbuf); rlbuf = NULL; } if (tty_input(input)) { #ifdef READLINE if (issue_prompt) rlbuf = readline(prompt_string); else rlbuf = readline(NULL); if (rlbuf != NULL) { if (strcmp(rlbuf,"") == 0) continue; strncpy(cmdbuf,rlbuf,MAXBUFSZ); } #else if (issue_prompt) printf("%s",prompt_string); cp = fgets(cmdbuf,MAXBUFSZ,input); #endif } else { cp = fgets(cmdbuf,MAXBUFSZ,input); } if (cp == NULL && rlbuf == NULL) { if (input == stdin) { return; /* end of file in tty command stream */ } else { btcmd_close_execute(&cblk); continue; } } find_cmd(cmdbuf,app_cmds); if (cblk.function != NULL) { if (cblk.nargs < 0) { bad_args(cblk.cmd); status = 1; } else { rl_history(input,rlbuf); if (echo && !tty_input(input)) { fprintf(stdout,"%s%s", prompt_string, cmdbuf); } status = (cblk.function)(&cblk); if (status > 0 && !cblk.unknown_cmd) { (error_handler)(status); } } if (status > 0 && stop_on_error && !tty_input(input)) { fprintf(stdout, "command file processing terminated " "(error on).\n"); if (input == stdin) { return; /* must be error in here document */ } else { while (input != stdin) btcmd_close_execute(&cblk); } } } } return; }
int main(int argc, char *argv[]) { printf("Zetsubou v0.1. Written by SquidMan (Alex Marshall)\nFormat information from YAGCD. RGB5A3 code by booto. CMP code by segher.\nLightly based off of gentpl by comex.\n\n"); if(argc < 3) bad_args(argv[0]); char type = toupper(argv[1][0]); char fmt = toupper(argv[1][1]); if(type == 'R') { // Read TPL. if(argc != 3) bad_args(argv[0]); FILE* fp = fopen(argv[2], "rb"); if(fp == NULL) { printf("Error opening %s.\n", argv[2]); exit(1); } char *basename = strdup(argv[2]); char *last_dot = strrchr(basename, '.'); if(last_dot) *last_dot = 0; fseek(fp, 0, SEEK_END); u32 tplsize = ftell(fp); u8* tplbuf = (u8*)malloc(tplsize); fseek(fp, 0, SEEK_SET); fread(tplbuf, tplsize, 1, fp); fclose(fp); int ret; int outfmt; if(fmt == 'B') outfmt = 0; else if(fmt == 'P') outfmt = 1; else bad_args(argv[0]); ret = TPL_ConvertToGD(tplbuf, tplsize, basename, outfmt); free(tplbuf); free(basename); if(ret < 0) { printf("Error converting from TPL.\n"); exit(1); } }else if(type == 'W') { // Write TPL. if(argc < 5) bad_args(argv[0]); char** names = (char**)calloc(sizeof(char*), argc - 4); int i; for(i = 0; i < argc - 4; i++) names[i] = argv[i + 3]; int format; char formatstr[256]; memset(formatstr, 0, 256); for(i = 0; i < strlen(argv[2]); i++) formatstr[i] = toupper(argv[2][i]); if(strcmp(formatstr, "I4") == 0) format = TPL_FORMAT_I4; else if(strcmp(formatstr, "I8") == 0) format = TPL_FORMAT_I8; else if(strcmp(formatstr, "IA4") == 0) format = TPL_FORMAT_IA4; else if(strcmp(formatstr, "IA8") == 0) format = TPL_FORMAT_IA8; else if(strcmp(formatstr, "RGB565") == 0) format = TPL_FORMAT_RGB565; else if(strcmp(formatstr, "RGB5A3") == 0) format = TPL_FORMAT_RGB5A3; else if(strcmp(formatstr, "RGBA8") == 0) format = TPL_FORMAT_RGBA8; else if(strcmp(formatstr, "CI4") == 0) format = TPL_FORMAT_CI4; else if(strcmp(formatstr, "CI8") == 0) format = TPL_FORMAT_CI8; else if(strcmp(formatstr, "CI14X2") == 0) format = TPL_FORMAT_CI14X2; else if(strcmp(formatstr, "CMP") == 0) format = TPL_FORMAT_CMP; int ret; int outfmt; if(fmt == 'B') outfmt = 0; else if(fmt == 'P') outfmt = 1; else bad_args(argv[0]); ret = TPL_ConvertFromGDs(argc - 4, names, argv[argc - 1], format, outfmt); if(ret < 0) { printf("Error converting to TPL.\n"); exit(1); } } return 0; }