|
|
1.1 ! root 1: /* SMMUTIL.C */ ! 2: ! 3: /* Developed 1990-1997 by Rob Swindell; PO Box 501, Yorba Linda, CA 92885 */ ! 4: ! 5: #include <stdio.h> ! 6: #include <time.h> ! 7: #include <stdlib.h> ! 8: #include <io.h> ! 9: #include <dos.h> ! 10: #include <fcntl.h> ! 11: #include <sys\stat.h> ! 12: #include <malloc.h> ! 13: #include <stdarg.h> ! 14: #include "gen_defs.h" ! 15: #include "smmdefs.h" ! 16: #include "crc32.h" ! 17: ! 18: struct date date; ! 19: struct time curtime; ! 20: ! 21: FILE *log=NULL; ! 22: ! 23: /****************************************************************************/ ! 24: /* Returns 32-crc of string (not counting terminating NULL) */ ! 25: /****************************************************************************/ ! 26: ulong crc32(char *str) ! 27: { ! 28: int i=0; ! 29: ulong crc=0xffffffffUL; ! 30: ! 31: while(str[i]) ! 32: crc=ucrc32(str[i++],crc); ! 33: crc=~crc; ! 34: return(crc); ! 35: } ! 36: ! 37: /****************************************************************************/ ! 38: /* Returns the age derived from the string 'birth' in the format MM/DD/YY */ ! 39: /****************************************************************************/ ! 40: char getage(char *birth) ! 41: { ! 42: char age; ! 43: ! 44: if(birth[0]<=SP) ! 45: return(0); ! 46: getdate(&date); ! 47: age=(date.da_year-1900)-(((birth[6]&0xf)*10)+(birth[7]&0xf)); ! 48: if(atoi(birth)>12 || atoi(birth+3)>31) ! 49: return(0); ! 50: if(((birth[0]&0xf)*10)+(birth[1]&0xf)>date.da_mon || ! 51: (((birth[0]&0xf)*10)+(birth[1]&0xf)==date.da_mon && ! 52: ((birth[3]&0xf)*10)+(birth[4]&0xf)>date.da_day)) ! 53: age--; ! 54: if(age<0) ! 55: return(0); ! 56: return(age); ! 57: } ! 58: ! 59: /**********************/ ! 60: /* Log print function */ ! 61: /**********************/ ! 62: void logprintf(char *str, ...) ! 63: { ! 64: va_list argptr; ! 65: char buf[256]; ! 66: time_t now; ! 67: struct tm *gm; ! 68: ! 69: va_start(argptr,str); ! 70: vsprintf(buf,str,argptr); ! 71: va_end(argptr); ! 72: fprintf(stderr,"\n%s",buf); ! 73: if(!log) return; ! 74: now=time(NULL); ! 75: gm=localtime(&now); ! 76: fseek(log,0L,SEEK_END); ! 77: fprintf(log,"%02u/%02u/%02u %02u:%02u:%02u %s\r\n" ! 78: ,gm->tm_mon+1,gm->tm_mday,gm->tm_year,gm->tm_hour,gm->tm_min,gm->tm_sec ! 79: ,buf); ! 80: fflush(log); ! 81: } ! 82: ! 83: ! 84: char *base41(unsigned int i, char *str) ! 85: { ! 86: char c; ! 87: unsigned int j=41*41,k; ! 88: ! 89: for(c=0;c<3;c++) { ! 90: k=i/j; ! 91: str[c]='0'+k; ! 92: i-=(k*j); ! 93: j/=41; ! 94: if(str[c]>=':') ! 95: str[c]='A'+(str[c]-':'); ! 96: if(str[c]>='[') ! 97: str[c]='#'+(str[c]-'['); } ! 98: str[c]=0; ! 99: return(str); ! 100: } ! 101: ! 102: /****************************************************************************/ ! 103: /* Updates 16-bit "rcrc" with character 'ch' */ ! 104: /****************************************************************************/ ! 105: void ucrc16(uchar ch, ushort *rcrc) { ! 106: ushort i, cy; ! 107: uchar nch=ch; ! 108: ! 109: for (i=0; i<8; i++) { ! 110: cy=*rcrc & 0x8000; ! 111: *rcrc<<=1; ! 112: if (nch & 0x80) *rcrc |= 1; ! 113: nch<<=1; ! 114: if (cy) *rcrc ^= 0x1021; } ! 115: } ! 116: ! 117: /****************************************************************************/ ! 118: /* Returns 16-crc of string (not counting terminating NULL) */ ! 119: /****************************************************************************/ ! 120: ushort crc16(char *str) ! 121: { ! 122: int i=0; ! 123: ushort crc=0; ! 124: ! 125: ucrc16(0,&crc); ! 126: while(str[i]) ! 127: ucrc16(str[i++],&crc); ! 128: ucrc16(0,&crc); ! 129: ucrc16(0,&crc); ! 130: return(crc); ! 131: } ! 132: ! 133: ! 134: void delphoto(user_t user) ! 135: { ! 136: char fname[64],path[128],tmp[128]; ! 137: int i; ! 138: struct ffblk ff; ! 139: ! 140: if(!(user.misc&USER_PHOTO)) ! 141: return; ! 142: for(i=0;user.system[i];i++) ! 143: if(isalnum(user.system[i])) ! 144: break; ! 145: if(!user.system[i]) ! 146: fname[0]='~'; ! 147: else ! 148: fname[0]=user.system[i]; ! 149: for(i=strlen(user.system)-1;i>0;i--) ! 150: if(isalnum(user.system[i])) ! 151: break; ! 152: if(i<=0) ! 153: fname[1]='~'; ! 154: else ! 155: fname[1]=user.system[i]; ! 156: fname[2]=0; ! 157: strupr(user.system); ! 158: strcat(fname,base41(crc16(user.system),tmp)); ! 159: strcat(fname,base41(user.number,tmp)); ! 160: strcat(fname,".*"); ! 161: strupr(fname); ! 162: sprintf(path,"PHOTO\\%s",fname); ! 163: i=findfirst(path,&ff,0); ! 164: if(i) ! 165: return; ! 166: sprintf(path,"PHOTO\\%s",ff.ff_name); ! 167: if(remove(path)) ! 168: logprintf("Photo (%s) couldn't be removed!",path); ! 169: else ! 170: logprintf("Photo (%s) removed",path); ! 171: } ! 172: ! 173: ! 174: int main(int argc, char **argv) ! 175: { ! 176: int i,file,max_age=0,max_wall=0,age; ! 177: long l,m,total_ixbs=0 ! 178: ,users=0,photos=0,networked=0 ! 179: ,male_straight=0 ! 180: ,male_gay=0 ! 181: ,male_bi=0 ! 182: ,female_straight=0 ! 183: ,female_gay=0 ! 184: ,female_bi=0 ! 185: ,age12=0 ! 186: ,age15=0 ! 187: ,age20=0,age25=0 ! 188: ,age30=0,age35=0 ! 189: ,age40=0,age45=0 ! 190: ,age50=0,age55=0 ! 191: ,age60=0,age65=0 ! 192: ,age70=0,age71=0 ! 193: ,zodiac_aries=0 ! 194: ,zodiac_taurus=0 ! 195: ,zodiac_gemini=0 ! 196: ,zodiac_cancer=0 ! 197: ,zodiac_leo=0 ! 198: ,zodiac_virgo=0 ! 199: ,zodiac_libra=0 ! 200: ,zodiac_scorpio=0 ! 201: ,zodiac_sagittarius=0 ! 202: ,zodiac_capricorn=0 ! 203: ,zodiac_aquarius=0 ! 204: ,zodiac_pisces=0 ! 205: ,hair_blonde=0 ! 206: ,hair_brown=0 ! 207: ,hair_red=0 ! 208: ,hair_black=0 ! 209: ,hair_grey=0 ! 210: ,hair_other=0 ! 211: ,eyes_blue=0 ! 212: ,eyes_green=0 ! 213: ,eyes_hazel=0 ! 214: ,eyes_brown=0 ! 215: ,eyes_other=0 ! 216: ,race_white=0 ! 217: ,race_black=0 ! 218: ,race_hispanic=0 ! 219: ,race_asian=0 ! 220: ,race_amerindian=0 ! 221: ,race_mideastern=0 ! 222: ,race_other=0 ! 223: ,marital_single=0 ! 224: ,marital_married=0 ! 225: ,marital_divorced=0 ! 226: ,marital_widowed=0 ! 227: ,marital_other=0 ! 228: ; ! 229: FILE *ixb_fp,*dab_fp,*tmp_fp; ! 230: ixb_t huge *ixb=NULL,ixbrec; ! 231: user_t user; ! 232: wall_t wall; ! 233: time_t now; ! 234: ! 235: fprintf(stderr,"\nSMMUTIL � Synchronet Match Maker Utility � v2.01�\n\n"); ! 236: ! 237: for(i=1;i<argc;i++) ! 238: if(isdigit(argv[i][0])) { ! 239: if(max_age) ! 240: max_wall=atoi(argv[i]); ! 241: else ! 242: max_age=atoi(argv[i]); } ! 243: else { ! 244: printf("usage: SMMUTIL max_profile_age_in_days " ! 245: "max_wall_writing_age_in_days\n"); ! 246: printf("\n"); ! 247: printf("example: SMMUTIL 90 7\n"); ! 248: exit(1); } ! 249: ! 250: if((file=open("SMM.IXB",O_RDWR|O_BINARY|O_CREAT|O_DENYNONE ! 251: ,S_IWRITE|S_IREAD))==-1 ! 252: || (ixb_fp=fdopen(file,"r+b"))==NULL) { ! 253: printf("Error opening SMM.IXB\n"); ! 254: exit(1); } ! 255: ! 256: if((file=open("SMM.DAB",O_RDWR|O_BINARY|O_DENYNONE))==-1 ! 257: || (dab_fp=fdopen(file,"r+b"))==NULL) { ! 258: printf("Error opening SMM.DAB\n"); ! 259: exit(1); } ! 260: ! 261: if((file=open("SMM.TMP",O_WRONLY|O_CREAT|O_TRUNC|O_BINARY|O_DENYALL ! 262: ,S_IWRITE|S_IREAD))==-1 ! 263: || (tmp_fp=fdopen(file,"r+b"))==NULL) { ! 264: printf("Error opening SMM.TMP\n"); ! 265: exit(1); } ! 266: ! 267: if((file=open("SMMUTIL.LOG",O_WRONLY|O_CREAT|O_APPEND|O_BINARY|O_DENYALL ! 268: ,S_IWRITE|S_IREAD))==-1 ! 269: || (log=fdopen(file,"w+b"))==NULL) { ! 270: printf("Error opening SMMUTIL.LOG\n"); ! 271: exit(1); } ! 272: ! 273: fprintf(stderr,"Reading profile data..."); ! 274: rewind(dab_fp); ! 275: while(!feof(dab_fp)) { ! 276: if(!fread(&user,sizeof(user_t),1,dab_fp)) ! 277: break; ! 278: if((ixb=REALLOC(ixb,sizeof(ixb_t)*(total_ixbs+1)))==NULL) { ! 279: printf("Malloc error\n"); ! 280: exit(1); } ! 281: user.name[25]=0; ! 282: strupr(user.name); ! 283: ixb[total_ixbs].name=crc32(user.name); ! 284: user.system[25]=0; ! 285: strupr(user.system); ! 286: ixb[total_ixbs].system=crc32(user.system); ! 287: ixb[total_ixbs].updated=user.updated; ! 288: if(user.misc&USER_DELETED) ! 289: ixb[total_ixbs].number=0; ! 290: else ! 291: ixb[total_ixbs].number=user.number; ! 292: total_ixbs++; } ! 293: fprintf(stderr,"\n"); ! 294: ! 295: now=time(NULL); ! 296: fprintf(stderr,"Creating new profile index and data files..."); ! 297: chsize(fileno(ixb_fp),0); ! 298: rewind(ixb_fp); ! 299: rewind(tmp_fp); ! 300: for(l=0;l<total_ixbs;l++) { ! 301: fseek(dab_fp,l*sizeof(user_t),SEEK_SET); ! 302: if(!fread(&user,sizeof(user_t),1,dab_fp)) { ! 303: logprintf("%04lX Couldn't read user record",l); ! 304: continue; } ! 305: ! 306: /* Make sure all strings are NULL terminated */ ! 307: user.name[25]=user.realname[25]=user.system[40]=user.birth[8]=0; ! 308: user.zipcode[10]=user.location[30]=0; ! 309: user.min_zipcode[10]=user.max_zipcode[10]=0; ! 310: for(i=0;i<5;i++) ! 311: user.note[i][50]=0; ! 312: ! 313: if(!ixb[l].number) { ! 314: logprintf("%04lX %5lu %-25s Deleted user" ! 315: ,l,user.number,user.system); ! 316: delphoto(user); ! 317: continue; } ! 318: if(ixb[l].number&0xffff0000UL) { ! 319: logprintf("%04lX %5lu %-25s Invalid user number" ! 320: ,l,ixb[l].number,user.system); ! 321: delphoto(user); ! 322: continue; } ! 323: if(max_age ! 324: && now>ixb[l].updated // Not in the future ! 325: && (now-ixb[l].updated)/(24UL*60UL*60UL)>max_age) { ! 326: logprintf("%04lX %5lu %-25s Not updated in %lu days" ! 327: ,l,user.number,user.system,(now-ixb[l].updated)/(24UL*60UL*60UL)); ! 328: delphoto(user); ! 329: continue; } ! 330: for(m=l+1;m<total_ixbs;m++) ! 331: if(ixb[l].number ! 332: && ixb[l].number==ixb[m].number && ixb[l].system==ixb[m].system) ! 333: break; ! 334: if(m<total_ixbs) { /* Duplicate found! */ ! 335: logprintf("%04lX %5lu %-25s Duplicate user" ! 336: ,l,user.number,user.system); ! 337: delphoto(user); ! 338: continue; } ! 339: ! 340: if(user.name[0]<SP || user.realname[0]<SP || user.system[0]<SP ! 341: || user.location[0]<SP || user.zipcode[0]<SP || user.birth[0]<SP) { ! 342: logprintf("%04lX %5lu %-25s Invalid user string" ! 343: ,l,user.number,user.system); ! 344: delphoto(user); ! 345: continue; } ! 346: if(!user.sex || !user.marital || !user.race || !user.hair || !user.eyes) { ! 347: logprintf("%04lX %5lu %-25s Null field" ! 348: ,l,user.number,user.system); ! 349: delphoto(user); ! 350: continue; } ! 351: if(user.sex=='M') { ! 352: if(user.pref_sex=='F') ! 353: male_straight++; ! 354: else if(user.pref_sex=='M') ! 355: male_gay++; ! 356: else ! 357: male_bi++; } ! 358: else if(user.sex=='F') { ! 359: if(user.pref_sex=='M') ! 360: female_straight++; ! 361: else if(user.pref_sex=='F') ! 362: female_gay++; ! 363: else ! 364: female_bi++; } ! 365: else { ! 366: logprintf("%04lX %5lu %-25s Invalid sex (%02X)" ! 367: ,l,user.number,user.system,user.sex); ! 368: delphoto(user); ! 369: continue; } ! 370: users++; ! 371: if(user.misc&USER_PHOTO) ! 372: photos++; ! 373: if(user.misc&USER_FROMSMB) ! 374: networked++; ! 375: age=getage(user.birth); ! 376: if(age<13) age12++; ! 377: else if(age<16) age15++; ! 378: else if(age<21) age20++; ! 379: else if(age<26) age25++; ! 380: else if(age<31) age30++; ! 381: else if(age<36) age35++; ! 382: else if(age<41) age40++; ! 383: else if(age<46) age45++; ! 384: else if(age<51) age50++; ! 385: else if(age<56) age55++; ! 386: else if(age<61) age60++; ! 387: else if(age<66) age65++; ! 388: else if(age<71) age70++; ! 389: else age71++; ! 390: switch(user.hair) { ! 391: case HAIR_BLONDE: ! 392: hair_blonde++; ! 393: break; ! 394: case HAIR_BROWN: ! 395: hair_brown++; ! 396: break; ! 397: case HAIR_RED: ! 398: hair_red++; ! 399: break; ! 400: case HAIR_BLACK: ! 401: hair_black++; ! 402: break; ! 403: case HAIR_GREY: ! 404: hair_grey++; ! 405: break; ! 406: default: ! 407: hair_other++; ! 408: break; } ! 409: ! 410: switch(user.eyes) { ! 411: case EYES_BLUE: ! 412: eyes_blue++; ! 413: break; ! 414: case EYES_BROWN: ! 415: eyes_brown++; ! 416: break; ! 417: case EYES_GREEN: ! 418: eyes_green++; ! 419: break; ! 420: case EYES_HAZEL: ! 421: eyes_hazel++; ! 422: break; ! 423: default: ! 424: eyes_other++; ! 425: break; } ! 426: switch(user.marital) { ! 427: case MARITAL_SINGLE: ! 428: marital_single++; ! 429: break; ! 430: case MARITAL_MARRIED: ! 431: marital_married++; ! 432: break; ! 433: case MARITAL_DIVORCED: ! 434: marital_divorced++; ! 435: break; ! 436: case MARITAL_WIDOWED: ! 437: marital_widowed++; ! 438: break; ! 439: default: ! 440: marital_other++; ! 441: break; } ! 442: ! 443: switch(user.race) { ! 444: case RACE_WHITE: ! 445: race_white++; ! 446: break; ! 447: case RACE_BLACK: ! 448: race_black++; ! 449: break; ! 450: case RACE_HISPANIC: ! 451: race_hispanic++; ! 452: break; ! 453: case RACE_ASIAN: ! 454: race_asian++; ! 455: break; ! 456: case RACE_AMERINDIAN: ! 457: race_amerindian++; ! 458: break; ! 459: case RACE_MIDEASTERN: ! 460: race_mideastern++; ! 461: break; ! 462: default: ! 463: race_other++; ! 464: break; } ! 465: ! 466: if((!strncmp(user.birth,"03",2) && atoi(user.birth+3)>=21) ! 467: || (!strncmp(user.birth,"04",2) && atoi(user.birth+3)<=19)) ! 468: zodiac_aries++; ! 469: else if((!strncmp(user.birth,"04",2) && atoi(user.birth+3)>=20) ! 470: || (!strncmp(user.birth,"05",2) && atoi(user.birth+3)<=20)) ! 471: zodiac_taurus++; ! 472: else if((!strncmp(user.birth,"05",2) && atoi(user.birth+3)>=21) ! 473: || (!strncmp(user.birth,"06",2) && atoi(user.birth+3)<=20)) ! 474: zodiac_gemini++; ! 475: else if((!strncmp(user.birth,"06",2) && atoi(user.birth+3)>=21) ! 476: || (!strncmp(user.birth,"07",2) && atoi(user.birth+3)<=22)) ! 477: zodiac_cancer++; ! 478: else if((!strncmp(user.birth,"07",2) && atoi(user.birth+3)>=23) ! 479: || (!strncmp(user.birth,"08",2) && atoi(user.birth+3)<=22)) ! 480: zodiac_leo++; ! 481: else if((!strncmp(user.birth,"08",2) && atoi(user.birth+3)>=23) ! 482: || (!strncmp(user.birth,"09",2) && atoi(user.birth+3)<=22)) ! 483: zodiac_virgo++; ! 484: else if((!strncmp(user.birth,"09",2) && atoi(user.birth+3)>=23) ! 485: || (!strncmp(user.birth,"10",2) && atoi(user.birth+3)<=22)) ! 486: zodiac_libra++; ! 487: else if((!strncmp(user.birth,"10",2) && atoi(user.birth+3)>=23) ! 488: || (!strncmp(user.birth,"11",2) && atoi(user.birth+3)<=21)) ! 489: zodiac_scorpio++; ! 490: else if((!strncmp(user.birth,"11",2) && atoi(user.birth+3)>=22) ! 491: || (!strncmp(user.birth,"12",2) && atoi(user.birth+3)<=21)) ! 492: zodiac_sagittarius++; ! 493: else if((!strncmp(user.birth,"12",2) && atoi(user.birth+3)>=22) ! 494: || (!strncmp(user.birth,"01",2) && atoi(user.birth+3)<=19)) ! 495: zodiac_capricorn++; ! 496: else if((!strncmp(user.birth,"01",2) && atoi(user.birth+3)>=20) ! 497: || (!strncmp(user.birth,"02",2) && atoi(user.birth+3)<=18)) ! 498: zodiac_aquarius++; ! 499: else if((!strncmp(user.birth,"02",2) && atoi(user.birth+3)>=19) ! 500: || (!strncmp(user.birth,"03",2) && atoi(user.birth+3)<=20)) ! 501: zodiac_pisces++; ! 502: ! 503: fwrite(&ixb[l],sizeof(ixb_t),1,ixb_fp); ! 504: fwrite(&user,sizeof(user_t),1,tmp_fp); ! 505: } ! 506: fprintf(stderr,"\n"); ! 507: fcloseall(); ! 508: remove("SMM.DAB"); ! 509: rename("SMM.TMP","SMM.DAB"); ! 510: ! 511: printf("Synchronet Match Maker Statistics\n"); ! 512: printf("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n"); ! 513: printf("\n"); ! 514: printf("%-25s : %lu\n","Total",users); ! 515: printf("%-25s : %lu\n","Photos",photos); ! 516: printf("%-25s : %lu\n","Networked",networked); ! 517: // if(male_straight) ! 518: printf("%-25s (%4.1f%%) : %lu\n","Sex: male (hetero)" ! 519: ,(((float)male_straight/users)*100.0),male_straight); ! 520: // if(male_gay) ! 521: printf("%-25s (%4.1f%%) : %lu\n","Sex: male (gay)" ! 522: ,(((float)male_gay/users)*100.0),male_gay); ! 523: // if(male_bi) ! 524: printf("%-25s (%4.1f%%) : %lu\n","Sex: male (bi)" ! 525: ,(((float)male_bi/users)*100.0),male_bi); ! 526: // if(female_straight) ! 527: printf("%-25s (%4.1f%%) : %lu\n","Sex: female (hetero)" ! 528: ,(((float)female_straight/users)*100.0),female_straight); ! 529: // if(female_gay) ! 530: printf("%-25s (%4.1f%%) : %lu\n","Sex: female (gay)" ! 531: ,(((float)female_gay/users)*100.0),female_gay); ! 532: // if(female_bi) ! 533: printf("%-25s (%4.1f%%) : %lu\n","Sex: female (bi)" ! 534: ,(((float)female_bi/users)*100.0),female_bi); ! 535: // if(age12) ! 536: printf("%-25s (%4.1f%%) : %lu\n","Age: 12 and younger" ! 537: ,(((float)age12/users)*100.0),age12); ! 538: // if(age15) ! 539: printf("%-25s (%4.1f%%) : %lu\n","Age: 13 to 15 years old" ! 540: ,(((float)age15/users)*100.0),age15); ! 541: // if(age20) ! 542: printf("%-25s (%4.1f%%) : %lu\n","Age: 16 to 20 years old" ! 543: ,(((float)age20/users)*100.0),age20); ! 544: // if(age25) ! 545: printf("%-25s (%4.1f%%) : %lu\n","Age: 21 to 25 years old" ! 546: ,(((float)age25/users)*100.0),age25); ! 547: // if(age30) ! 548: printf("%-25s (%4.1f%%) : %lu\n","Age: 26 to 30 years old" ! 549: ,(((float)age30/users)*100.0),age30); ! 550: // if(age35) ! 551: printf("%-25s (%4.1f%%) : %lu\n","Age: 31 to 35 years old" ! 552: ,(((float)age35/users)*100.0),age35); ! 553: // if(age40) ! 554: printf("%-25s (%4.1f%%) : %lu\n","Age: 36 to 40 years old" ! 555: ,(((float)age40/users)*100.0),age40); ! 556: // if(age45) ! 557: printf("%-25s (%4.1f%%) : %lu\n","Age: 41 to 45 years old" ! 558: ,(((float)age45/users)*100.0),age45); ! 559: // if(age50) ! 560: printf("%-25s (%4.1f%%) : %lu\n","Age: 46 to 50 years old" ! 561: ,(((float)age50/users)*100.0),age50); ! 562: // if(age55) ! 563: printf("%-25s (%4.1f%%) : %lu\n","Age: 51 to 55 years old" ! 564: ,(((float)age55/users)*100.0),age55); ! 565: // if(age60) ! 566: printf("%-25s (%4.1f%%) : %lu\n","Age: 56 to 60 years old" ! 567: ,(((float)age60/users)*100.0),age60); ! 568: // if(age65) ! 569: printf("%-25s (%4.1f%%) : %lu\n","Age: 61 to 65 years old" ! 570: ,(((float)age65/users)*100.0),age65); ! 571: // if(age70) ! 572: printf("%-25s (%4.1f%%) : %lu\n","Age: 66 to 70 years old" ! 573: ,(((float)age70/users)*100.0),age70); ! 574: // if(age71) ! 575: printf("%-25s (%4.1f%%) : %lu\n","Age: 71 and older" ! 576: ,(((float)age71/users)*100.0),age71); ! 577: // if(hair_blonde) ! 578: printf("%-25s (%4.1f%%) : %lu\n","Hair: blonde" ! 579: ,(((float)hair_blonde/users)*100.0),hair_blonde); ! 580: // if(hair_brown) ! 581: printf("%-25s (%4.1f%%) : %lu\n","Hair: brown" ! 582: ,(((float)hair_brown/users)*100.0),hair_brown); ! 583: // if(hair_black) ! 584: printf("%-25s (%4.1f%%) : %lu\n","Hair: black" ! 585: ,(((float)hair_black/users)*100.0),hair_black); ! 586: // if(hair_red) ! 587: printf("%-25s (%4.1f%%) : %lu\n","Hair: red" ! 588: ,(((float)hair_red/users)*100.0),hair_red); ! 589: // if(hair_grey) ! 590: printf("%-25s (%4.1f%%) : %lu\n","Hair: grey" ! 591: ,(((float)hair_grey/users)*100.0),hair_grey); ! 592: // if(hair_other) ! 593: printf("%-25s (%4.1f%%) : %lu\n","Hair: other" ! 594: ,(((float)hair_other/users)*100.0),hair_other); ! 595: // if(eyes_blue) ! 596: printf("%-25s (%4.1f%%) : %lu\n","Eyes: blue" ! 597: ,(((float)eyes_blue/users)*100.0),eyes_blue); ! 598: // if(eyes_brown) ! 599: printf("%-25s (%4.1f%%) : %lu\n","Eyes: brown" ! 600: ,(((float)eyes_brown/users)*100.0),eyes_brown); ! 601: // if(eyes_green) ! 602: printf("%-25s (%4.1f%%) : %lu\n","Eyes: green" ! 603: ,(((float)eyes_green/users)*100.0),eyes_green); ! 604: // if(eyes_hazel) ! 605: printf("%-25s (%4.1f%%) : %lu\n","Eyes: hazel" ! 606: ,(((float)eyes_hazel/users)*100.0),eyes_hazel); ! 607: // if(eyes_other) ! 608: printf("%-25s (%4.1f%%) : %lu\n","Eyes: other" ! 609: ,(((float)eyes_other/users)*100.0),eyes_other); ! 610: // if(race_white) ! 611: printf("%-25s (%4.1f%%) : %lu\n","Race: white" ! 612: ,(((float)race_white/users)*100.0),race_white); ! 613: // if(race_black) ! 614: printf("%-25s (%4.1f%%) : %lu\n","Race: black" ! 615: ,(((float)race_black/users)*100.0),race_black); ! 616: // if(race_asian) ! 617: printf("%-25s (%4.1f%%) : %lu\n","Race: asian" ! 618: ,(((float)race_asian/users)*100.0),race_asian); ! 619: // if(race_amerindian) ! 620: printf("%-25s (%4.1f%%) : %lu\n","Race: amerindian" ! 621: ,(((float)race_amerindian/users)*100.0),race_amerindian); ! 622: // if(race_mideastern) ! 623: printf("%-25s (%4.1f%%) : %lu\n","Race: mideastern" ! 624: ,(((float)race_mideastern/users)*100.0),race_mideastern); ! 625: // if(race_hispanic) ! 626: printf("%-25s (%4.1f%%) : %lu\n","Race: hispanic" ! 627: ,(((float)race_hispanic/users)*100.0),race_hispanic); ! 628: // if(race_other) ! 629: printf("%-25s (%4.1f%%) : %lu\n","Race: other" ! 630: ,(((float)race_other/users)*100.0),race_other); ! 631: // if(marital_single) ! 632: printf("%-25s (%4.1f%%) : %lu\n","Marital: single" ! 633: ,(((float)marital_single/users)*100.0),marital_single); ! 634: // if(marital_married) ! 635: printf("%-25s (%4.1f%%) : %lu\n","Marital: married" ! 636: ,(((float)marital_married/users)*100.0),marital_married); ! 637: // if(marital_divorced) ! 638: printf("%-25s (%4.1f%%) : %lu\n","Marital: divorced" ! 639: ,(((float)marital_divorced/users)*100.0),marital_divorced); ! 640: // if(marital_widowed) ! 641: printf("%-25s (%4.1f%%) : %lu\n","Marital: widowed" ! 642: ,(((float)marital_widowed/users)*100.0),marital_widowed); ! 643: // if(marital_other) ! 644: printf("%-25s (%4.1f%%) : %lu\n","Marital: other" ! 645: ,(((float)marital_other/users)*100.0),marital_other); ! 646: // if(zodiac_aries) ! 647: printf("%-25s (%4.1f%%) : %lu\n","Zodiac: aries" ! 648: ,(((float)zodiac_aries/users)*100.0),zodiac_aries); ! 649: // if(zodiac_taurus) ! 650: printf("%-25s (%4.1f%%) : %lu\n","Zodiac: taurus" ! 651: ,(((float)zodiac_taurus/users)*100.0),zodiac_taurus); ! 652: // if(zodiac_gemini) ! 653: printf("%-25s (%4.1f%%) : %lu\n","Zodiac: gemini" ! 654: ,(((float)zodiac_gemini/users)*100.0),zodiac_gemini); ! 655: // if(zodiac_cancer) ! 656: printf("%-25s (%4.1f%%) : %lu\n","Zodiac: cancer" ! 657: ,(((float)zodiac_cancer/users)*100.0),zodiac_cancer); ! 658: // if(zodiac_leo) ! 659: printf("%-25s (%4.1f%%) : %lu\n","Zodiac: leo" ! 660: ,(((float)zodiac_leo/users)*100.0),zodiac_leo); ! 661: // if(zodiac_virgo) ! 662: printf("%-25s (%4.1f%%) : %lu\n","Zodiac: virgo" ! 663: ,(((float)zodiac_virgo/users)*100.0),zodiac_virgo); ! 664: // if(zodiac_libra) ! 665: printf("%-25s (%4.1f%%) : %lu\n","Zodiac: libra" ! 666: ,(((float)zodiac_libra/users)*100.0),zodiac_libra); ! 667: // if(zodiac_scorpio) ! 668: printf("%-25s (%4.1f%%) : %lu\n","Zodiac: scorpio" ! 669: ,(((float)zodiac_scorpio/users)*100.0),zodiac_scorpio); ! 670: // if(zodiac_sagittarius) ! 671: printf("%-25s (%4.1f%%) : %lu\n","Zodiac: sagittarius" ! 672: ,(((float)zodiac_sagittarius/users)*100.0),zodiac_sagittarius); ! 673: // if(zodiac_capricorn) ! 674: printf("%-25s (%4.1f%%) : %lu\n","Zodiac: capricorn" ! 675: ,(((float)zodiac_capricorn/users)*100.0),zodiac_capricorn); ! 676: // if(zodiac_aquarius) ! 677: printf("%-25s (%4.1f%%) : %lu\n","Zodiac: aquarius" ! 678: ,(((float)zodiac_aquarius/users)*100.0),zodiac_aquarius); ! 679: // if(zodiac_pisces) ! 680: printf("%-25s (%4.1f%%) : %lu\n","Zodiac: pisces" ! 681: ,(((float)zodiac_pisces/users)*100.0),zodiac_pisces); ! 682: ! 683: if(!max_wall) ! 684: return(0); ! 685: ! 686: if((file=open("WALL.DAB",O_RDWR|O_BINARY|O_DENYNONE))==-1 ! 687: || (dab_fp=fdopen(file,"r+b"))==NULL) { ! 688: printf("Error opening WALL.DAB\n"); ! 689: exit(1); } ! 690: ! 691: if((file=open("WALL.TMP",O_WRONLY|O_CREAT|O_TRUNC|O_BINARY|O_DENYALL ! 692: ,S_IWRITE|S_IREAD))==-1 ! 693: || (tmp_fp=fdopen(file,"r+b"))==NULL) { ! 694: printf("Error opening WALL.TMP\n"); ! 695: exit(1); } ! 696: ! 697: fprintf(stderr,"Reading wall data..."); ! 698: rewind(dab_fp); ! 699: while(!feof(dab_fp)) { ! 700: if(!fread(&wall,sizeof(wall_t),1,dab_fp)) ! 701: break; ! 702: if((now-wall.imported)/(24UL*60UL*60UL)<=max_wall) ! 703: fwrite(&wall,sizeof(wall_t),1,tmp_fp); } ! 704: ! 705: fprintf(stderr,"\n"); ! 706: fcloseall(); ! 707: remove("WALL.DAB"); ! 708: rename("WALL.TMP","WALL.DAB"); ! 709: ! 710: return(0); ! 711: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.