int main(int argc, char *argv[]) { unsigned int repeat=0; char **tags; int i; int a; int b; float gdivide_a; float gdivide_b; char are_you_sure[100]; #ifdef NAJI_DEBUG fprintf(stderr, "\n\n"); fprintf(stderr, "NAJI_DEBUG - check if two commands are displayed as one joined string,\n"); fprintf(stderr, " you might have missed a , in najitool_valid_commands[]\n\n"); for (i=0; i<NAJITOOL_MAX_COMMANDS; i++) fprintf(stderr, "%s ", najitool_valid_commands[i]); fgetc(stdin); #endif /* NAJI_DEBUG */ #ifdef NAJI_DEBUG fprintf(stderr, "\n\nNAJI_DEBUG - YOUR PARAMETERS/ARGUMENTS:\n\n"); for (i=0; i<argc; i++) fprintf(stderr, "%s ", argv[i]); fprintf(stderr, "\n\n"); fgetc(stdin); #endif /* NAJI_DEBUG */ if (argc >= 2) { tolowers(argv[1]); najitool_check_command(argv[1]); } if (argc == 1) { printf("\n\n"); /* printf(" __ | \n"); printf(" / \\ | \n"); printf(" / _____| | o \\ \n"); printf(" | \\ o |___| \n"); printf(" \\____\\ \n"); printf(" o o T O O L \n"); */ printf(" __ | ********************************************\n"); printf(" / \\ | najitool 0.8.4 using libnaji 0.6.4 \n"); printf(" / _____| | o \\ both written by NECDET COKYAZICI \n"); printf(" | \\ o |___| and contributors \n"); printf(" \\____\\ ********************************************\n"); printf(" o o T O O L No warranty, to view the license type: \n"); printf(" najitool license \n"); printf(" http://najitool.sf.net/ ********************************************\n"); printf(" To view the credits type: najitool credits \n"); printf(" Public Domain, 2003-2011 ********************************************\n"); printf("\n"); forhelp(); return 0; } if (argc >= 2) { if (!strcmp(argv[1], "mp3taged")) { if ((argc % 2 != 1) | (argc == 3)) { printf("mp3taged: too few arguments '%s'\n", argv[1]); return 1; } /* * we save the tags' options: * tags[i] = <tag name> * tags[i+1] = <user content> * .. */ tags = (char**) malloc (sizeof(char*)*(argc-3)*2); for (i=0; i<(argc-3)*2; i+=2) tags[i] = (char*) malloc(7*sizeof(char)); for (i=1; i<(argc-3)*2; i+=2) tags[i] = argv[i+2]; for (i=0; i<(argc-3)*2; i+=2) memcpy (tags[i], argv[i+2], 7); mp3editag (argv[argc-1], tags, argc-3); for (i=0; i<(argc-3)*2; i+=2) free(tags[i]); free(tags); return 0; } if (!strcmp(argv[1], "credits")) { if (argc > 2) tooparam("credits"); naji_credits(); return 0; } if (!strcmp(argv[1], "asctable")) { if (argc > 2) tooparam("asctable"); asctable(); return 0; } if (!strcmp(argv[1], "engnum")) { if (argc > 2) tooparam("engnum"); engnum(); return 0; } if (!strcmp(argv[1], "turnum")) { if (argc > 2) tooparam("turnum"); turnum(); return 0; } if (!strcmp(argv[1], "najcrypt")) { if (argc > 2) tooparam("najcrypt"); najcrypt(); return 0; } if (!strcmp(argv[1], "database")) { if (argc > 2) tooparam("database"); naji_database(); return 0; } if (!strcmp(argv[1], "html_db")) { if (argc > 2) tooparam("html_db"); naji_html_database(); return 0; } if (!strcmp(argv[1], "calc")) { if (argc > 2) tooparam("calc"); naji_calc(); return 0; } if (!strcmp(argv[1], "length")) { if (argc > 2) tooparam("length"); length(); return 0; } if (!strcmp(argv[1], "mathgame")) { if (argc > 2) tooparam("mathgame"); mathgame(); return 0; } if (!strcmp(argv[1], "license")) { if (argc > 2) tooparam("license"); naji_license(); return 0; } if (!strcmp(argv[1], "ttt")) { if (argc > 2) tooparam("ttt"); ttt(); return 0; } if (!strcmp(argv[1], "naji_bmp")) { if (argc > 2) tooparam("naji_bmp"); naji_bmp(); return 0; } if (!strcmp(argv[1], "unihtml")) { if (argc > 2) tooparam("unihtml"); naji_gen_unicode_html_pages(); return 0; } if (!strcmp(argv[1], "rmunihtm")) { if (argc > 2) tooparam("rmunihtm"); naji_del_gen_unicode_html_pages(); return 0; } if (!strcmp(argv[1], "cat_text")) { if (argc == 2) { naji_stdin_msg(); cat_text_stdin(); return 0; } if (argc == 3) { cat_text(argv[2]); return 0; } if (argc > 3) tooparam("cat_text"); return 0; } if (!strcmp(argv[1], "kitten")) { if (argc == 2) { naji_stdin_msg(); kitten_stdin(); return 0; } if (argc == 3) { kitten(argv[2]); return 0; } if (argc > 3) tooparam("kitten"); return 0; } if (!strcmp(argv[1], "genlic")) { if (argc > 2) tooparam("genlic"); naji_genlic(); return 0; } if (!strcmp(argv[1], "genhelp")) { if (argc > 2) tooparam("genhelp"); najitool_generate_help(); return 0; } if (!strcmp(argv[1], "htmlhelp")) { if (argc > 2) tooparam("htmlhelp"); najitool_generate_help_html(); return 0; } if (!strcmp(argv[1], "systemdt")) { if (argc > 2) tooparam("systemdt"); systemdt(); return 0; } if (!strcmp(argv[1], "datetime")) { if (argc > 2) tooparam("datetime"); datetime(); return 0; } if (!strcmp(argv[1], "telltime")) { if (argc > 2) tooparam("telltime"); printf("\n\n"); telltime(); printf("\n\n"); return 0; } if (!strcmp(argv[1], "today")) { if (argc > 2) tooparam("today"); printf("\n\n"); today(); printf("\n\n"); return 0; } if (!strcmp(argv[1], "dayofmon")) { if (argc > 2) tooparam("dayofmon"); printf("\n\n"); dayofmon(); printf("\n\n"); return 0; } if (!strcmp(argv[1], "month")) { if (argc > 2) tooparam("month"); printf("\n\n"); month(); printf("\n\n"); return 0; } if (!strcmp(argv[1], "year")) { if (argc > 2) tooparam("year"); printf("\n\n"); year(); printf("\n\n"); return 0; } if (!strcmp(argv[1], "saatarih")) { if (argc > 2) tooparam("saatarih"); saatarih(); return 0; } if (!strcmp(argv[1], "saat")) { if (argc > 2) tooparam("saat"); printf("\n\n"); saat(); printf("\n\n"); return 0; } if (!strcmp(argv[1], "bugun")) { if (argc > 2) tooparam("bugun"); printf("\n\n"); bugun(); printf("\n\n"); return 0; } if (!strcmp(argv[1], "ayinkaci")) { if (argc > 2) tooparam("ayinkaci"); printf("\n\n"); ayinkaci(); printf("\n\n"); return 0; } if (!strcmp(argv[1], "ay")) { if (argc > 2) tooparam("ay"); printf("\n\n"); ay(); printf("\n\n"); return 0; } if (!strcmp(argv[1], "yil")) { if (argc > 2) tooparam("yil"); printf("\n\n"); yil(); printf("\n\n"); return 0; } if (!strcmp(argv[1], "allbmp16")) { if (argc > 2) tooparam("allbmp16"); printf("\n\n"); allbmp16(); printf("\n\n"); return 0; } if (!strcmp(argv[1], "help")) { if (argc == 2) { printf("\n\nAvailable help catagories:\n\n"); printf("commands\n"); printf("\n\n"); forhelp(); return 0; } if (argc == 3) { if (!strcmp(argv[2], "commands")) najitool_help_commands(); else najitool_command_help(argv[2]); return 0; } if (argc > 3) tooparam("help"); return 0; } begin_cmd("mergline", 7) mergline(argv[2], argv[3], argv[4], argv[5], argv[6]); end_cmd() begin_cmd("mp3split", 6) mp3split(argv[4], argv[5], atoi(argv[2]), atoi(argv[3])); end_cmd() begin_cmd("rrrchars", 6) rrrchars(argv[2], argv[3], atoi(argv[4]), atoi(argv[5])); end_cmd() begin_cmd("chstr", 6) chstr(argv[2], argv[3], argv[4], argv[5]); end_cmd() begin_cmd("chchars", 6) chchars(argv[2], argv[3], argv[4], argv[5]); end_cmd() begin_cmd("chchar", 6) chchar(argv[2], argv[3], argv[4][0], argv[5][0]); end_cmd() begin_cmd("filechop", 6) filechop( (strtol(argv[2], NULL, 0)), argv[3], argv[4], argv[5]); end_cmd() begin_cmd("putlines", 6) putlines(argv[2], argv[3], argv[4], argv[5]); end_cmd() begin_cmd("copyoffs", 6) copyoffs(argv[2], strtoul(argv[3], NULL, 0), strtoul(argv[4], NULL, 0), argv[5]); end_cmd() begin_cmd("istrael", 6) istrael(argv[2], atoi(argv[3]), argv[4], argv[5]); end_cmd() begin_cmd("addline", 6) addline(argv[2], argv[3], argv[4], strtoul(argv[5], NULL, 0)); end_cmd() begin_cmd("replacel", 6) replacel(argv[2], argv[3], argv[4], strtoul(argv[5], NULL, 0)); end_cmd() begin_cmd("bremline", 5) bremline(argv[2], argv[3], argv[4]); end_cmd() begin_cmd("eremline", 5) eremline(argv[2], argv[3], argv[4]); end_cmd() begin_cmd("remline", 5) remline(argv[2], argv[3], argv[4]); end_cmd() begin_cmd("skipstr", 5) skipstr(argv[2], argv[3], argv[4]); end_cmd() begin_cmd("makarray", 5) makarray(argv[2], argv[3], argv[4]); end_cmd() begin_cmd("streline", 5) streline(argv[2], argv[3], argv[4]); end_cmd() begin_cmd("strbline", 5) strbline(argv[2], argv[3], argv[4]); end_cmd() begin_cmd("swapfeb", 5) swapfeb(argv[2], argv[3], argv[4]); end_cmd() begin_cmd("filbreed", 5) filbreed(argv[2], argv[3], argv[4]); end_cmd() begin_cmd("skipchar", 5) skipchar(argv[2], argv[3], argv[4]); end_cmd() begin_cmd("onlychar", 5) onlychar(argv[2], argv[3], argv[4]); end_cmd() begin_cmd("repchar", 5) repeat = (unsigned int) atoi(argv[4]); repchar(argv[2], argv[3], repeat); end_cmd() begin_cmd("linesnip", 5) repeat = (unsigned int) atoi(argv[2]); linesnip(repeat, argv[3], argv[4]); end_cmd() begin_cmd("charwarp", 5) repeat = (unsigned int) atoi(argv[4]); charwrap(repeat, argv[2], argv[3]); end_cmd() begin_cmd("repcharp", 5) repeat = (unsigned int) atoi(argv[4]); repcharp(argv[2], argv[3], repeat); end_cmd() begin_cmd("coffset", 5) coffset(argv[2], strtoul(argv[3], NULL, 0), strtoul(argv[4], NULL, 0)); end_cmd() begin_cmd("dumpoffs", 5) dumpoffs(argv[2], strtoul(argv[3], NULL, 0), strtoul(argv[4], NULL, 0)); end_cmd() begin_cmd("bin2c", 5) bin2c(argv[2], argv[3], argv[4]); end_cmd() begin_cmd("filejoin", 5) filejoin(argv[2], argv[3], argv[4]); end_cmd() begin_cmd("mkpatch", 5) mkpatch(argv[2], argv[3], argv[4]); end_cmd() begin_cmd("charfile", 5) repeat = (unsigned int) atoi(argv[3]); charfile(argv[2], repeat, argv[4][0]); end_cmd() begin_cmd("strfile", 5) repeat = (unsigned int) atoi(argv[3]); strfile(argv[2], repeat, argv[4]); end_cmd() begin_cmd("tabspace", 5) repeat = atoi(argv[2]); tabspace(repeat, argv[3], argv[4]); end_cmd() begin_cmd("charaftr", 5) charaftr(argv[2], argv[3], argv[4][0]); end_cmd() begin_cmd("charbefr", 5) charbefr(argv[2], argv[3], argv[4][0]); end_cmd() begin_cmd("strachar", 5) strachar(argv[2], argv[3], argv[4]); end_cmd() begin_cmd("strbchar", 5) strbchar(argv[2], argv[3], argv[4]); end_cmd() begin_cmd("rstrach", 5) rstrach(atoi(argv[2]), argv[3], argv[4]); end_cmd() begin_cmd("rstrbch", 5) rstrbch(atoi(argv[2]), argv[3], argv[4]); end_cmd() begin_cmd("cpfroml", 5) cpfroml(atoi(argv[2]), argv[3], argv[4]); end_cmd() begin_cmd("cptiline", 5) cptiline(atoi(argv[2]), argv[3], argv[4]); end_cmd() begin_cmd("n2ch", 5) n2ch(argv[2][0], argv[3], argv[4]); end_cmd() begin_cmd("n2str", 5) n2str(argv[2], argv[3], argv[4]); end_cmd() begin_cmd("weakrypt", 5) weakrypt(argv[2], argv[3], argv[4]); end_cmd() begin_cmd("sp2ce2sp", 5) sp2ce2sp(argv[2][0], argv[3], argv[4]); end_cmd() begin_cmd("istreml", 5) istreml(argv[2], argv[3], argv[4]); end_cmd() begin_cmd("removel", 5) removel(argv[2], argv[3], strtoul(argv[4], NULL, 0)); end_cmd() begin_cmd("printftx", 4) printftx(argv[2], argv[3]); end_cmd() begin_cmd("lensorts", 4) lensorts(argv[2], argv[3]); end_cmd() begin_cmd("lensortl", 4) lensortl(argv[2], argv[3]); end_cmd() begin_cmd("find", 4) find(argv[2], argv[3]); end_cmd() begin_cmd("findi", 4) findi(argv[2], argv[3]); end_cmd() begin_cmd("cfind", 4) cfind(argv[2], argv[3]); end_cmd() begin_cmd("cfindi", 4) cfindi(argv[2], argv[3]); end_cmd() begin_cmd("showline", 4) showline(argv[2], atoi(argv[3])); end_cmd() begin_cmd("cat_tail", 4) cat_tail(argv[2], atoi(argv[3])); end_cmd() begin_cmd("cat_head", 4) cat_head(argv[2], atoi(argv[3])); end_cmd() begin_cmd("getlinks", 4) getlinks(argv[2], argv[3]); end_cmd() begin_cmd("f2upper", 4) f2upper(argv[2], argv[3]); end_cmd() begin_cmd("f2lower", 4) f2lower(argv[2], argv[3]); end_cmd() begin_cmd("fswpcase", 4) fswpcase(argv[2], argv[3]); end_cmd() begin_cmd("downlist", 4) downlist(argv[2], argv[3]); end_cmd() begin_cmd("hilist", 4) hilist(argv[2], argv[3]); end_cmd() begin_cmd("rtcafter", 4) rtcafter(argv[2], argv[3]); end_cmd() begin_cmd("rtcbefor", 4) rtcbefor(argv[2], argv[3]); end_cmd() begin_cmd("rbcafter", 4) rbcafter(argv[2], argv[3]); end_cmd() begin_cmd("rbcbefor", 4) rbcbefor(argv[2], argv[3]); end_cmd() begin_cmd("numlines", 4) numlines(argv[2], argv[3]); end_cmd() begin_cmd("file2dec", 4) file2dec(argv[2], argv[3]); end_cmd() begin_cmd("file2hex", 4) file2hex(argv[2], argv[3]); end_cmd() begin_cmd("file2bin", 4) file2bin(argv[2], argv[3]); end_cmd() begin_cmd("wordline", 4) wordline(argv[2], argv[3]); end_cmd() begin_cmd("8bit256", 4) repeat = (unsigned int) atoi(argv[3]); _8bit256(argv[2], repeat); end_cmd() begin_cmd("eng2arab", 4) eng2arab(argv[2], argv[3]); end_cmd() begin_cmd("arab2eng", 4) arab2eng(argv[2], argv[3]); end_cmd() begin_cmd("e2ahtml", 4) e2ahtml(argv[2], argv[3]); end_cmd() begin_cmd("freverse", 4) freverse(argv[2], argv[3]); end_cmd() begin_cmd("repcat", 4) repeat = (unsigned int) atoi(argv[3]); repcat(argv[2], repeat); end_cmd() begin_cmd("repcatpp", 4) repeat = (unsigned int) atoi(argv[3]); repcatpp(argv[2], repeat); end_cmd() begin_cmd("copyfile", 4) copyfile(argv[2], argv[3]); end_cmd() begin_cmd("qpatch", 4) qpatch(argv[2], argv[3]); end_cmd() begin_cmd("flipcopy", 4) flipcopy(argv[2], argv[3]); end_cmd() begin_cmd("fillfile", 4) fillfile(argv[2], argv[3][0]); end_cmd() begin_cmd("bin2text", 4) bin2text(argv[2], argv[3]); end_cmd() begin_cmd("bin2hexi", 4) bin2hexi(argv[2], argv[3]); end_cmd() begin_cmd("rndbfile", 4) rndbfile(argv[2], strtoul(argv[3], NULL, 0)); end_cmd() begin_cmd("rndtfile", 4) rndtfile(argv[2], strtoul(argv[3], NULL, 0)); end_cmd() begin_cmd("skipcat", 4) skipcat(argv[2], argv[3]); end_cmd() begin_cmd("onlycat", 4) onlycat(argv[2], argv[3]); end_cmd() begin_cmd("bigascif", 4) bigascif(argv[2], argv[3]); end_cmd() begin_cmd("leetfile", 4) leetfile(argv[2], argv[3]); end_cmd() begin_cmd("asc2ebc", 4) asc2ebc(argv[2], argv[3]); end_cmd() begin_cmd("ebc2asc", 4) ebc2asc(argv[2], argv[3]); end_cmd() begin_cmd("unix2dos", 4) unix2dos(argv[2], argv[3]); end_cmd() begin_cmd("dos2unix", 4) dos2unix(argv[2], argv[3]); end_cmd() begin_cmd("uuencode", 4) uuencode(argv[2], argv[3]); end_cmd() begin_cmd("uudecode", 4) uudecode(argv[2], argv[3]); end_cmd() begin_cmd("wordwrap", 4) wordwrap(argv[2], argv[3]); end_cmd() begin_cmd("compare", 4) compare(argv[2], argv[3]); end_cmd() begin_cmd("ccompare", 4) ccompare(argv[2], argv[3]); end_cmd() begin_cmd("hmakerf", 4) hmakerf(argv[2], argv[3]); end_cmd() begin_cmd("qcrypt", 4) qcrypt(argv[2], argv[3]); end_cmd() begin_cmd("revlines", 4) revlines(argv[2], argv[3]); end_cmd() begin_cmd("html2txt", 4) html2txt(argv[2], argv[3]); end_cmd() begin_cmd("txt2html", 4) txt2html(argv[2], argv[3]); end_cmd() begin_cmd("htmlfast", 4) htmlfast(argv[2], argv[3]); end_cmd() begin_cmd("onlalnum", 4) onlalnum(argv[2], argv[3]); end_cmd() begin_cmd("onlalpha", 4) onlalpha(argv[2], argv[3]); end_cmd() begin_cmd("onlcntrl", 4) onlcntrl(argv[2], argv[3]); end_cmd() begin_cmd("onldigit", 4) onldigit(argv[2], argv[3]); end_cmd() begin_cmd("onlgraph", 4) onlgraph(argv[2], argv[3]); end_cmd() begin_cmd("onllower", 4) onllower(argv[2], argv[3]); end_cmd() begin_cmd("onlprint", 4) onlprint(argv[2], argv[3]); end_cmd() begin_cmd("onlpunct", 4) onlpunct(argv[2], argv[3]); end_cmd() begin_cmd("onlspace", 4) onlspace(argv[2], argv[3]); end_cmd() begin_cmd("onlupper", 4) onlupper(argv[2], argv[3]); end_cmd() begin_cmd("onlxdigt", 4) onlxdigt(argv[2], argv[3]); end_cmd() begin_cmd("skpalnum", 4) skpalnum(argv[2], argv[3]); end_cmd() begin_cmd("skpalpha", 4) skpalpha(argv[2], argv[3]); end_cmd() begin_cmd("skpcntrl", 4) skpcntrl(argv[2], argv[3]); end_cmd() begin_cmd("skpdigit", 4) skpdigit(argv[2], argv[3]); end_cmd() begin_cmd("skpgraph", 4) skpgraph(argv[2], argv[3]); end_cmd() begin_cmd("skplower", 4) skplower(argv[2], argv[3]); end_cmd() begin_cmd("skpprint", 4) skpprint(argv[2], argv[3]); end_cmd() begin_cmd("skppunct", 4) skppunct(argv[2], argv[3]); end_cmd() begin_cmd("skpspace", 4) skpspace(argv[2], argv[3]); end_cmd() begin_cmd("skpupper", 4) skpupper(argv[2], argv[3]); end_cmd() begin_cmd("skpxdigt", 4) skpxdigt(argv[2], argv[3]); end_cmd() begin_cmd("ftothe", 4) ftothe(argv[2], argv[3]); end_cmd() begin_cmd("blanka", 4) blanka(argv[2], argv[3]); end_cmd() begin_cmd("unblanka", 4) unblanka(argv[2], argv[3]); end_cmd() begin_cmd("najirle", 4) najirle(argv[2], argv[3]); end_cmd() begin_cmd("unajirle", 4) unajirle(argv[2], argv[3]); end_cmd() begin_cmd("gplus", 4) a = atoi(argv[2]); b = atoi(argv[3]); gplus(a, b); end_cmd() begin_cmd("gminus", 4) a = atoi(argv[2]); b = atoi(argv[3]); gminus(a, b); end_cmd() begin_cmd("gtimes", 4) a = atoi(argv[2]); b = atoi(argv[3]); gtimes(a, b); end_cmd() begin_cmd("gdivide", 4) gdivide_a = atof(argv[2]); gdivide_b = atof(argv[3]); gdivide(gdivide_a, gdivide_b); end_cmd() begin_cmd("bytsplit", 4) bytsplit(argv[2], atol(argv[3])); end_cmd() begin_cmd("kbsplit", 4) kbsplit(argv[2], atol(argv[3])); end_cmd() begin_cmd("mbsplit", 4) mbsplit(argv[2], atol(argv[3])); end_cmd() begin_cmd("gbsplit", 4) gbsplit(argv[2], atol(argv[3])); end_cmd() begin_cmd("mjoin", 4) mjoin(argv[2], argv[3]); end_cmd() begin_cmd("listdigt", 4) listdigt(atoi(argv[2]), argv[3]); end_cmd() begin_cmd("listlowr", 4) listlowr(atoi(argv[2]), argv[3]); end_cmd() begin_cmd("listprnt", 4) listprnt(atoi(argv[2]), argv[3]); end_cmd() begin_cmd("listuppr", 4) listuppr(atoi(argv[2]), argv[3]); end_cmd() begin_cmd("charsort", 4) charsort(argv[2], argv[3]); end_cmd() begin_cmd("sp2re2sp", 4) sp2re2sp(argv[2], argv[3]); end_cmd() begin_cmd("lcvfiles", 3) lcvfiles(argv[2]); end_cmd() begin_cmd("rcvfiles", 3) rcvfiles(argv[2]); end_cmd() begin_cmd("mp3tagnf", 3) mp3info(argv[2]); end_cmd() begin_cmd("catrandl", 3) catrandl(argv[2]); end_cmd() begin_cmd("leetstr", 3) printf("\n\n"); leetstr(argv[2]); printf("\n\n"); end_cmd() begin_cmd("lcharvar", 3) lcharvar(argv[2]); end_cmd() begin_cmd("rcharvar", 3) rcharvar(argv[2]); end_cmd() begin_cmd("hexicat", 3) hexicat(argv[2]); end_cmd() begin_cmd("rndffill", 3) rndffill(argv[2]); end_cmd() begin_cmd("zerokill", 3) zerokill(argv[2]); end_cmd() begin_cmd("randkill", 3) randkill(argv[2]); end_cmd() begin_cmd("najisum", 3) najisum(argv[2]); end_cmd() begin_cmd("rndbsout", 3) rndbsout(strtoul(argv[2], NULL, 0)); end_cmd() begin_cmd("rndtsout", 3) rndtsout(strtoul(argv[2], NULL, 0)); end_cmd() begin_cmd("patch", 3) patch(argv[2]); end_cmd() begin_cmd("revcat", 3) revcat(argv[2]); end_cmd() begin_cmd("copyself", 3) copyfile(argv[0], argv[2]); end_cmd() begin_cmd("bigascii", 3) bigascii(argv[2]); end_cmd() begin_cmd("hmaker", 3) hmaker(argv[2]); end_cmd() begin_cmd("wrdcount", 3) printf("\n\n%i\n\n", wrdcount(argv[2])); end_cmd() begin_cmd("addim", 3) addim(atoi(argv[2])); end_cmd() begin_cmd("allfiles", 3) fprintf(stderr, "\n" "NOTE: On most systems you can stop with Ctrl+C\n" "WARNING: This will make a lot of files.\n" "Are you sure? type YES to continue\n" "or anything else to quit.\n" ); safegets(are_you_sure, 80); if (!strcmp(are_you_sure, "YES")) allfiles(atol(argv[2])); end_cmd(); begin_cmd("tothe", 3) tothe(argv[2]); end_cmd() begin_cmd("vowelwrd", 3) vowelwrd(argv[2]); end_cmd() begin_cmd("gigabyte", 3) gigabyte(strtoul(argv[2], NULL, 0)); end_cmd() begin_cmd("sort", 3) sort(argv[2]); end_cmd() begin_cmd("sortlast", 3) sortlast(argv[2]); end_cmd() begin_cmd("lineback", 3) lineback(argv[2]); end_cmd() begin_cmd("longline", 3) longline(argv[2]); end_cmd() begin_cmd("howline", 3) howline(argv[2]); end_cmd() begin_cmd("rndlines", 3) rndlines(argv[2]); end_cmd() begin_cmd("spyramid", 3) spyramid(argv[2]); end_cmd() } /* if (argc >= 2) */ return 0; }
int32_t CALLBACK wWinMain( HINSTANCE window_instance, HINSTANCE, // hPrevInst is useless LPWSTR, // not using lpCmdLine int) // not using nCmdShow { LARGE_INTEGER perf_count_freq_result; QueryPerformanceFrequency(&perf_count_freq_result); int64_t perf_count_freq = perf_count_freq_result.QuadPart; win32_load_xinput(); wchar_t *wnd_class_name = L"Handmade Hero Window Class"; WNDCLASSEXW wnd_class = {}; // c++11 aggregate init to zero the struct wnd_class.cbSize = sizeof(wnd_class); wnd_class.style = CS_HREDRAW | CS_VREDRAW; wnd_class.lpfnWndProc = win32_wnd_proc; wnd_class.hInstance = window_instance; wnd_class.lpszClassName = wnd_class_name; ATOM wnd_class_atom = RegisterClassExW(&wnd_class); if (0 == wnd_class_atom) { win32_debug_print_last_error(); HANDMADE_ASSERT(0 != wnd_class_atom); return 0; } HWND hwnd = CreateWindowExW(0, wnd_class_name, L"Handmade Hero", WS_OVERLAPPEDWINDOW | WS_VISIBLE, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, nullptr, nullptr, window_instance, nullptr); if (hwnd == nullptr) { win32_debug_print_last_error(); HANDMADE_ASSERT(nullptr != hwnd); return 0; } win32_resize_backbuffer(&g_backbuffer, 1280, 720); // test sound win32_sound_output sound_output {}; sound_output.running_sample_index = 0; sound_output.num_sound_ch = 2; sound_output.samples_per_sec = 48000; sound_output.sec_to_buffer = 2; sound_output.latency_sample_count = sound_output.samples_per_sec / 15; sound_output.bytes_per_sample = sizeof(int16_t) * sound_output.num_sound_ch; sound_output.sound_buffer_size = sound_output.samples_per_sec * sound_output.bytes_per_sample * sound_output.sec_to_buffer; // create buffer for 2 sec win32_init_direct_sound(hwnd, sound_output.num_sound_ch, sound_output.samples_per_sec, sound_output.sound_buffer_size); int16_t *samples = nullptr; if (g_sound_buffer) { // fill the whole buffer and started playing sound. win32_clear_sound_buffer(g_sound_buffer); g_sound_buffer->Play(0, 0, DSBPLAY_LOOPING); // allocate sound buffer sample // Guarantee to be allocation granularity (64KB) aligned // commited to page boundary (4KB), but the rest are wasted space // memory auto clears to 0 // freed automatically when app terminates samples = static_cast<int16_t*>(win32_alloc_zeroed( nullptr, sound_output.sound_buffer_size)); } // input const real32 left_thumb_norm_deadzone = win32_get_xinput_stick_normalized_deadzone( XINPUT_GAMEPAD_LEFT_THUMB_DEADZONE); const real32 right_thumb_norm_deadzone = win32_get_xinput_stick_normalized_deadzone( XINPUT_GAMEPAD_RIGHT_THUMB_DEADZONE); game_input input[2] = {}; game_input *new_input = &input[0]; game_input *old_input = &input[1]; // game memory #if HANDMADE_INTERNAL_BUILD void *base_memory_ptr = reinterpret_cast<void*>(terabyte(2ULL)); #else void *base_memory_ptr = nullptr; #endif game_memory memory {}; memory.permanent_storage_size = megabyte(64ULL); memory.transient_storage_size = gigabyte(1ULL); uint64_t total_size = memory.permanent_storage_size + memory.transient_storage_size; // Guarantee to be allocation granularity (64KB) aligned // commited to page boundary (4KB), but the rest are wasted space // memory auto clears to 0 // freed automatically when app terminates memory.permanent_storage = win32_alloc_zeroed(base_memory_ptr, total_size); memory.transient_storage = static_cast<int8_t*>(memory.permanent_storage) + memory.permanent_storage_size; if (g_backbuffer.memory && samples && memory.permanent_storage && memory.transient_storage) { g_running = true; uint64_t last_cycle_count = __rdtsc(); LARGE_INTEGER last_perf_counter; QueryPerformanceCounter(&last_perf_counter); while (g_running) { // We don't really need old input for keyboard as all keyboard // events are processed by wm msgs. So, just copy the old state. game_controller_input *kbd_controller = get_controller(new_input, game_input::kbd_controller_index); *kbd_controller = *get_controller(old_input, game_input::kbd_controller_index); win32_process_wm_msg_synchonously(kbd_controller); if (!g_running) { break; } constexpr uint32_t max_controller_count = std::min( XUSER_MAX_COUNT, game_input::max_controller_count - 1); for (DWORD controller_index = 0; controller_index < max_controller_count; ++controller_index) { // controller index 0 is reserved for keyboard DWORD true_controller_index = controller_index + 1; XINPUT_STATE controller_state {}; game_controller_input *new_controller = get_controller(new_input, true_controller_index); // Simply get the state of the controller from XInput. if (ERROR_SUCCESS == XInputGetState(controller_index, &controller_state)) { // Controller is connected new_controller->is_connected = true; const game_controller_input *old_controller = get_controller(old_input, true_controller_index); // dwPacketNumber indicates if there have been state changes controller_state.dwPacketNumber; const XINPUT_GAMEPAD *pad = &controller_state.Gamepad; // these are what we care about win32_process_xinput_digital_button( &new_controller->move_up, &old_controller->move_up, pad, XINPUT_GAMEPAD_DPAD_UP); win32_process_xinput_digital_button( &new_controller->move_down, &old_controller->move_down, pad, XINPUT_GAMEPAD_DPAD_DOWN); win32_process_xinput_digital_button( &new_controller->move_left, &old_controller->move_left, pad, XINPUT_GAMEPAD_DPAD_LEFT); win32_process_xinput_digital_button( &new_controller->move_right, &old_controller->move_right, pad, XINPUT_GAMEPAD_DPAD_RIGHT); win32_process_xinput_digital_button( &new_controller->action_up, &old_controller->action_up, pad, XINPUT_GAMEPAD_Y); win32_process_xinput_digital_button( &new_controller->action_down, &old_controller->action_down, pad, XINPUT_GAMEPAD_A); win32_process_xinput_digital_button( &new_controller->action_left, &old_controller->action_left, pad, XINPUT_GAMEPAD_X); win32_process_xinput_digital_button( &new_controller->action_right, &old_controller->action_right, pad, XINPUT_GAMEPAD_B); win32_process_xinput_digital_button( &new_controller->left_shoulder, &old_controller->left_shoulder, pad, XINPUT_GAMEPAD_LEFT_SHOULDER); win32_process_xinput_digital_button( &new_controller->right_shoulder, &old_controller->right_shoulder, pad, XINPUT_GAMEPAD_RIGHT_SHOULDER); // bool32 start = pad->wButtons & XINPUT_GAMEPAD_START; // bool32 back = pad->wButtons & XINPUT_GAMEPAD_BACK; win32_process_xinput_digital_button( &new_controller->start, &old_controller->start, pad, XINPUT_GAMEPAD_START); win32_process_xinput_digital_button( &new_controller->back, &old_controller->back, pad, XINPUT_GAMEPAD_BACK); // process stick new_controller->is_analog = true; new_controller->left_stick.avg_x = win32_xinput_thumb_resolve_deadzone_normalize( pad->sThumbLX, left_thumb_norm_deadzone); new_controller->left_stick.avg_y = win32_xinput_thumb_resolve_deadzone_normalize( pad->sThumbLY, left_thumb_norm_deadzone); new_controller->right_stick.avg_x = win32_xinput_thumb_resolve_deadzone_normalize( pad->sThumbRX, right_thumb_norm_deadzone); new_controller->right_stick.avg_y = win32_xinput_thumb_resolve_deadzone_normalize( pad->sThumbRY, right_thumb_norm_deadzone); } else { // Controller is not connected new_controller->is_connected = false; } } // DirectSound output test uint32_t byte_to_lock = 0; uint32_t bytes_to_write = 0; if (g_sound_buffer) { DWORD play_cursor; DWORD write_cursor; if (SUCCEEDED(g_sound_buffer->GetCurrentPosition(&play_cursor, &write_cursor))) { // fill the buffer till the play cursor + latency, // start location is the last location we wrote to byte_to_lock = (sound_output.running_sample_index * sound_output.bytes_per_sample) % sound_output.sound_buffer_size; // TODO: this may be dangerous! overwriting part of memory // between play cursor and write cursor DWORD target_to_cursor = (play_cursor + sound_output.latency_sample_count * sound_output.bytes_per_sample) % sound_output.sound_buffer_size; if (byte_to_lock > target_to_cursor) { bytes_to_write = sound_output.sound_buffer_size - byte_to_lock + target_to_cursor; } else { bytes_to_write = target_to_cursor - byte_to_lock; } } } game_sound_buffer game_sound_buffer {}; if (bytes_to_write > 0) { game_sound_buffer.samples = samples; game_sound_buffer.sample_count = bytes_to_write / sound_output.bytes_per_sample; game_sound_buffer.samples_per_sec = sound_output.samples_per_sec; } game_offscreen_buffer buffer {}; buffer.width = g_backbuffer.width; buffer.height = g_backbuffer.height; buffer.pitch = g_backbuffer.pitch; buffer.memory = g_backbuffer.memory; game_update_and_render(&memory, &buffer, &game_sound_buffer, new_input); if (bytes_to_write > 0) { win32_fill_sound_buffer(&sound_output, &game_sound_buffer, byte_to_lock, bytes_to_write); } HDC device_context = GetDC(hwnd); win32_window_dimension dimension = win32_get_window_dimension(hwnd); win32_display_offscreen_buffer(&g_backbuffer, device_context, dimension.width, dimension.height); ReleaseDC(hwnd, device_context); // swap game input game_input *tmp_input = new_input; new_input = old_input; old_input = tmp_input; uint64_t end_cycle_count = __rdtsc(); LARGE_INTEGER end_perf_counter; QueryPerformanceCounter(&end_perf_counter); // use signed, as it may go backward int64_t cycles_elapsed = end_cycle_count - last_cycle_count; int64_t counter_elapsed = end_perf_counter.QuadPart - last_perf_counter.QuadPart; real32 mega_cycles_per_frame = static_cast<real32>(cycles_elapsed) / 1000000.0f; real32 ms_per_frame = 1000.0f * static_cast<real32>(counter_elapsed) / static_cast<real32>(perf_count_freq); real32 fps = static_cast<real32>(perf_count_freq) / static_cast<real32>(counter_elapsed); // char buf[256]; // sprintf_s(buf, sizeof(buf), "%.2f Mc/f, %.2f ms/f, %.2f fps\n", // mega_cycles_per_frame, ms_per_frame, fps); // OutputDebugStringA(buf); last_perf_counter = end_perf_counter; last_cycle_count = end_cycle_count; } } else { // fail to allocate memory, no game. OutputDebugStringA("Fail to alloc memory to backbuffer, sound buffer, " "or game memory.\n"); } // MessageBoxW(nullptr, L"hello world", L"hello", MB_OK | MB_ICONINFORMATION); return 0; }