int main(const int argc, const char* const argv[]) { if (argc < 2) { // creating format::windows_bitmap::elements_type outelements = {1, 1}; format::windows_bitmap::header_type outheader(outelements); if (!outheader.validate()) { std::cerr << "It seems something is wrong\n" << std::endl; return 1; } util::io::set_stdout_binary(); std::cout << outheader << static_cast<char>(-1) << static_cast<char>(0) << static_cast<char>(0) << static_cast<char>(0); return 0; } // validating std::ifstream bin(argv[1], std::ios::binary); if (!bin.good()) { std::cerr << "bad file: " << argv[1] << "\n" << std::endl; return 1; } format::windows_bitmap::header_type inheader; bin >> inheader; if (!inheader.validate() || !inheader.validate(bin)) { std::cerr << "bad bmp file: " << argv[1] << "\n" << std::endl; return 1; } std::cout << "valid bmp file: " << argv[1] << "\n" << std::endl; return 0; }
/* write header to output file -----------------------------------------------*/ static int outhead(const char *outfile, char **infile, int n, const prcopt_t *popt, const solopt_t *sopt) { FILE *fp=stdout; trace(3,"outhead: outfile=%s n=%d\n",outfile,n); if (*outfile) { createdir(outfile); if (!(fp=fopen(outfile,"w"))) { showmsg("error : open output file %s",outfile); return 0; } } /* output header */ outheader(fp,infile,n,popt,sopt); if (*outfile) fclose(fp); return 1; }
/* * Called with args from main if argc >= 0. In this case, list scores as * requested. Otherwise, find scores for the current player (and list them * if argc == -1). */ void prscore(int argc, char **argv) { char **players = NULL; int playerct; int rank; struct toptenentry *t1, *t2; const char *recfile = RECORD; FILE *rfile; int flg = 0; int i; #ifdef nonsense long total_score = 0L; char totchars[10]; int totcharct = 0; #endif /* nonsense */ int outflg = (argc >= -1); #ifdef PERS_IS_UID int uid = -1; #else char *player0; #endif /* PERS_IS_UID */ if(!(rfile = fopen(recfile,"r"))){ puts("Cannot open record file!"); return; } if(argc > 1 && !strncmp(argv[1], "-s", 2)){ if(!argv[1][2]){ argc--; argv++; } else if(!argv[1][3] && index("CFKSTWX", argv[1][2])) { argv[1]++; argv[1][0] = '-'; } else argv[1] += 2; } if(argc <= 1){ #ifdef PERS_IS_UID uid = getuid(); playerct = 0; #else player0 = plname; if(!*player0) player0 = "hackplayer"; playerct = 1; players = &player0; #endif /* PERS_IS_UID */ } else { playerct = --argc; players = ++argv; } if(outflg) putchar('\n'); t1 = tt_head = newttentry(); for(rank = 1; ; rank++) { if(fscanf(rfile, "%6s %d %d %d %d %d %ld %c%c %[^,],%[^\n]", t1->date, &t1->uid, &t1->level, &t1->maxlvl, &t1->hp, &t1->maxhp, &t1->points, &t1->plchar, &t1->sex, t1->name, t1->death) != 11) t1->points = 0; if(t1->points == 0) break; #ifdef PERS_IS_UID if(!playerct && t1->uid == uid) flg++; else #endif /* PERS_IS_UID */ for(i = 0; i < playerct; i++){ if(strcmp(players[i], "all") == 0 || strncmp(t1->name, players[i], NAMSZ) == 0 || (players[i][0] == '-' && players[i][1] == t1->plchar && players[i][2] == 0) || (digit(players[i][0]) && rank <= atoi(players[i]))) flg++; } t1 = t1->tt_next = newttentry(); } fclose(rfile); if(!flg) { if(outflg) { printf("Cannot find any entries for "); if(playerct < 1) printf("you.\n"); else { if(playerct > 1) printf("any of "); for(i=0; i<playerct; i++) printf("%s%s", players[i], (i<playerct-1)?", ":".\n"); printf("Call is: %s -s [playernames]\n", hname); } } return; } if(outflg) outheader(); t1 = tt_head; for(rank = 1; t1->points != 0; rank++, t1 = t2) { t2 = t1->tt_next; #ifdef PERS_IS_UID if(!playerct && t1->uid == uid) goto outwithit; else #endif /* PERS_IS_UID */ for(i = 0; i < playerct; i++){ if(strcmp(players[i], "all") == 0 || strncmp(t1->name, players[i], NAMSZ) == 0 || (players[i][0] == '-' && players[i][1] == t1->plchar && players[i][2] == 0) || (digit(players[i][0]) && rank <= atoi(players[i]))){ outwithit: if(outflg) outentry(rank, t1, 0); #ifdef nonsense total_score += t1->points; if(totcharct < sizeof(totchars)-1) totchars[totcharct++] = t1->plchar; #endif /* nonsense */ break; } } free((char *) t1); } #ifdef nonsense totchars[totcharct] = 0; /* We would like to determine whether he is experienced. However, the information collected here only tells about the scores/roles that got into the topten (top 100?). We should maintain a .hacklog or something in his home directory. */ flags.beginner = (total_score < 6000); for(i=0; i<6; i++) if(!index(totchars, "CFKSTWX"[i])) { flags.beginner = 1; if(!pl_character[0]) pl_character[0] = "CFKSTWX"[i]; break; } #endif /* nonsense */ }
static void topten(void) { int uid = getuid(); int rank, rank0 = -1, rank1 = 0; int occ_cnt = PERSMAX; struct toptenentry *t0, *t1, *tprev; const char *recfile = RECORD; const char *reclock = "record_lock"; int sleepct = 300; FILE *rfile; int flg = 0; #define HUP if(!done_hup) while(link(recfile, reclock) == -1) { HUP perror(reclock); if(!sleepct--) { HUP puts("I give up. Sorry."); HUP puts("Perhaps there is an old record_lock around?"); return; } HUP printf("Waiting for access to record file. (%d)\n", sleepct); HUP fflush(stdout); sleep(1); } if(!(rfile = fopen(recfile,"r"))){ HUP puts("Cannot open record file!"); goto unlock; } HUP putchar('\n'); /* create a new 'topten' entry */ t0 = newttentry(); t0->level = dlevel; t0->maxlvl = maxdlevel; t0->hp = u.uhp; t0->maxhp = u.uhpmax; t0->points = u.urexp; t0->plchar = pl_character[0]; t0->sex = (flags.female ? 'F' : 'M'); t0->uid = uid; strncpy(t0->name, plname, NAMSZ); (t0->name)[NAMSZ] = 0; strncpy(t0->death, killer, DTHSZ); (t0->death)[DTHSZ] = 0; strcpy(t0->date, getdate()); /* assure minimum number of points */ if(t0->points < POINTSMIN) t0->points = 0; t1 = tt_head = newttentry(); tprev = 0; /* rank0: -1 undefined, 0 not_on_list, n n_th on list */ for(rank = 1; ; ) { if(fscanf(rfile, "%6s %d %d %d %d %d %ld %c%c %[^,],%[^\n]", t1->date, &t1->uid, &t1->level, &t1->maxlvl, &t1->hp, &t1->maxhp, &t1->points, &t1->plchar, &t1->sex, t1->name, t1->death) != 11 || t1->points < POINTSMIN) t1->points = 0; if(rank0 < 0 && t1->points < t0->points) { rank0 = rank++; if(tprev == 0) tt_head = t0; else tprev->tt_next = t0; t0->tt_next = t1; occ_cnt--; flg++; /* ask for a rewrite */ } else tprev = t1; if(t1->points == 0) break; if( #ifdef PERS_IS_UID t1->uid == t0->uid && #else strncmp(t1->name, t0->name, NAMSZ) == 0 && #endif /* PERS_IS_UID */ t1->plchar == t0->plchar && --occ_cnt <= 0){ if(rank0 < 0){ rank0 = 0; rank1 = rank; HUP printf("You didn't beat your previous score of %ld points.\n\n", t1->points); } if(occ_cnt < 0){ flg++; continue; } } if(rank <= ENTRYMAX){ t1 = t1->tt_next = newttentry(); rank++; } if(rank > ENTRYMAX){ t1->points = 0; break; } } if(flg) { /* rewrite record file */ fclose(rfile); if(!(rfile = fopen(recfile,"w"))){ HUP puts("Cannot write record file\n"); goto unlock; } if(!done_stopprint) if(rank0 > 0){ if(rank0 <= 10) puts("You made the top ten list!\n"); else printf("You reached the %d%s place on the top %d list.\n\n", rank0, ordin(rank0), ENTRYMAX); } } if(rank0 == 0) rank0 = rank1; if(rank0 <= 0) rank0 = rank; if(!done_stopprint) outheader(); t1 = tt_head; for(rank = 1; t1->points != 0; rank++, t1 = t1->tt_next) { if(flg) fprintf(rfile,"%6s %d %d %d %d %d %ld %c%c %s,%s\n", t1->date, t1->uid, t1->level, t1->maxlvl, t1->hp, t1->maxhp, t1->points, t1->plchar, t1->sex, t1->name, t1->death); if(done_stopprint) continue; if(rank > (int)flags.end_top && (rank < rank0-(int)flags.end_around || rank > rank0+(int)flags.end_around) && (!flags.end_own || #ifdef PERS_IS_UID t1->uid != t0->uid )) #else strncmp(t1->name, t0->name, NAMSZ))) #endif /* PERS_IS_UID */ continue; if(rank == rank0-(int)flags.end_around && rank0 > (int)flags.end_top+(int)flags.end_around+1 && !flags.end_own) putchar('\n'); if(rank != rank0) outentry(rank, t1, 0); else if(!rank1) outentry(rank, t1, 1); else { int t0lth = outentry(0, t0, -1); int t1lth = outentry(rank, t1, t0lth); if(t1lth > t0lth) t0lth = t1lth; outentry(0, t0, t0lth); } } if(rank0 >= rank) if(!done_stopprint) outentry(0, t0, 1); fclose(rfile); unlock: unlink(reclock); }