Annotation of sbbs/sbbs2/smm/smm.c, revision 1.1

1.1     ! root        1: /* SMM.C */
        !             2: 
        !             3: /* Developed 1990-1997 by Rob Swindell; PO Box 501, Yorba Linda, CA 92885 */
        !             4: 
        !             5: /* Synchronet Match Maker */
        !             6: 
        !             7: #include "xsdk.h"
        !             8: #include "crc32.h"
        !             9: #include "smmdefs.h"
        !            10: #include "smmvars.c"
        !            11: 
        !            12: /* RCIOLL.ASM */
        !            13: 
        !            14: int  rioini(int com,int irq);          /* initialize com,irq */
        !            15: int  setbaud(int rate);                /* set baud rate */
        !            16: int  rioctl(int action);               /* remote i/o control */
        !            17: int  dtr(char onoff);                  /* set/reset dtr */
        !            18: int  outcom(int ch);                   /* send character */
        !            19: int  incom(void);                      /* receive character */
        !            20: int  ivhctl(int intcode);              /* local i/o redirection */
        !            21: 
        !            22: /************************/
        !            23: /* Remote I/O Constants */
        !            24: /************************/
        !            25: 
        !            26:                                                        /* i/o mode and state flags */
        !            27: #define CTSCK 0x1000           /* check cts (mode only) */
        !            28: #define RTSCK 0x2000           /* check rts (mode only) */
        !            29: #define TXBOF 0x0800           /* transmit buffer overflow (outcom only) */
        !            30: #define ABORT 0x0400           /* check for ^C (mode), aborting (state) */
        !            31: #define PAUSE 0x0200           /* check for ^S (mode), pausing (state) */
        !            32: #define NOINP 0x0100           /* input buffer empty (incom only) */
        !            33: 
        !            34:                                                        /* status flags */
        !            35: #define RIODCD 0x80            /* DCD on */
        !            36: #define RI             0x40            /* Ring indicate */
        !            37: #define DSR    0x20            /* Dataset ready */
        !            38: #define CTS    0x10            /* CTS on */
        !            39: #define FERR   0x08            /* Frameing error */
        !            40: #define PERR   0x04            /* Parity error */
        !            41: #define OVRR   0x02            /* Overrun */
        !            42: #define RXLOST         0x01            /* Receive buffer overflow */
        !            43: 
        !            44: /* rioctl() arguments */
        !            45: /* returns mode or state flags in high 8 bits, status flags in low 8 bits */
        !            46: 
        !            47:                                                        /* the following return mode in high 8 bits */
        !            48: #define IOMODE 0               /* no operation */
        !            49: #define IOSM 1                 /* i/o set mode flags */
        !            50: #define IOCM 2                 /* i/o clear mode flags */
        !            51:                                                        /* the following return state in high 8 bits */
        !            52: #define IOSTATE 4              /* no operation */
        !            53: #define IOSS 5                 /* i/o set state flags */
        !            54: #define IOCS 6                 /* i/o clear state flags */
        !            55: #define IOFB 0x308             /* i/o buffer flush */
        !            56: #define IOFI 0x208             /* input buffer flush */
        !            57: #define IOFO 0x108             /* output buffer flush */
        !            58: #define IOCE 9                 /* i/o clear error flags */
        !            59: 
        !            60:                                                        /* return count (16bit) */
        !            61: #define RXBC   0x0a            /* get receive buffer count */
        !            62: #define TXBC   0x0b            /* get transmit buffer count */
        !            63: #define TXSYNC  0x0c        /* sync transmition (seconds<<8|0x0c) */
        !            64: #define IDLE   0x0d            /* suspend communication routines */
        !            65: #define RESUME  0x10d          /* return from suspended state */
        !            66: #define RLERC  0x000e          /* read line error count and clear */
        !            67: #define CPTON  0x0110          /* set input translation flag for ctrl-p on */
        !            68: #define CPTOFF 0x0010          /* set input translation flag for ctrl-p off */
        !            69: #define GETCPT 0x8010          /* return the status of ctrl-p translation */
        !            70: #define MSR    0x0011          /* read modem status register */
        !            71: #define FIFOCTL 0x0012         /* FIFO UART control */
        !            72: #define TSTYPE 0x0013          /* Time-slice API type */
        !            73: #define GETTST  0x8013      /* Get Time-slice API type */
        !            74: 
        !            75: 
        !            76: #define I14DB  0x001d          /* DigiBoard int 14h driver */
        !            77: #define I14PC  0x011d          /* PC int 14h driver */
        !            78: #define I14PS  0x021d          /* PS/2 int 14h driver */
        !            79: #define I14FO   0x031d      /* FOSSIL int 14h driver */
        !            80: 
        !            81: 
        !            82:                                                        /* ivhctl() arguments */
        !            83: #define INT29R 1               /* copy int 29h output to remote */
        !            84: #define INT29L 2                       /* Use _putlc for int 29h */
        !            85: #define INT16  0x10            /* return remote chars to int 16h calls */
        !            86: #define INTCLR 0            /* release int 16h, int 29h */
        !            87: 
        !            88: #define CLREOL         256     /* Character to erase to end of line            */
        !            89: #define HIGH        8       /* High intensity for curatr             */
        !            90: 
        !            91: extern uint riobp;
        !            92: extern int mswtyp;
        !            93: 
        !            94: unsigned _stklen=16000;        /* Set stack size in code, not header */
        !            95: 
        !            96: int cbreakh(void);                     /* ctrl-break handler */
        !            97: 
        !            98: char getage(char *birth);
        !            99: char long_user_info(user_t user);
        !           100: void main_user_info(user_t user);
        !           101: 
        !           102: char *nulstr="";
        !           103: char *wday[]={"Sun","Mon","Tue","Wed","Thu","Fri","Sat"};
        !           104: char *mon[]={"Jan","Feb","Mar","Apr","May","Jun"
        !           105:             ,"Jul","Aug","Sep","Oct","Nov","Dec"};
        !           106: char tmp[256],door_sys[128];
        !           107: 
        !           108: char io_int=0;
        !           109: struct date date;
        !           110: struct time curtime;
        !           111: time_t now;
        !           112: int smm_pause=1,node_scrnlen;
        !           113: questionnaire_t *que[5];
        !           114: int total_ques;
        !           115: user_t useron,tmpuser;
        !           116: ixb_t ixb;
        !           117: ulong useron_record,system_crc;
        !           118: FILE *stream,*index,*trashfile;
        !           119: 
        !           120: char *PrevReadSendQuitOrMore="\r\n\1n\1b\1h[\1cP\1b]revious screen, "
        !           121:        "[\1cR\1b]ead profile, [\1cS\1b]end telegram, [\1cQ\1b]uit, or "
        !           122:        "[\1cM\1b]ore: \1w";
        !           123: 
        !           124: int intocm(int in)
        !           125: {
        !           126: return(in*2.538071);
        !           127: }
        !           128: 
        !           129: int cmtoin(int cm)
        !           130: {
        !           131:        int i;
        !           132: 
        !           133: i=cm*0.394;
        !           134: if(((float)cm*0.394)-(float)i>=.5)
        !           135:        i++;
        !           136: return(i);
        !           137: }
        !           138: 
        !           139: int kgtolp(int kg)
        !           140: {
        !           141: return(kg*2.2046);
        !           142: }
        !           143: 
        !           144: int lptokg(int lp)
        !           145: {
        !           146:        int i;
        !           147: 
        !           148: i=lp*0.453597;
        !           149: if(((float)lp*0.453597)-(float)i>=.5)
        !           150:        i++;
        !           151: return(i);
        !           152: }
        !           153: 
        !           154: /****************************************************************************/
        !           155: /* Performs printf() through local assembly routines                        */
        !           156: /* Called from everywhere                                                   */
        !           157: /****************************************************************************/
        !           158: int lprintf(char *fmat, ...) {
        !           159:        char sbuf[256];
        !           160:        int chcount;
        !           161: 
        !           162: chcount=vsprintf(sbuf,fmat,_va_ptr);
        !           163: lputs(sbuf);
        !           164: return(chcount);
        !           165: }
        !           166: 
        !           167: /*****************************************************************************/
        !           168: /* Returns command line generated from instr with %c replacments             */
        !           169: /*****************************************************************************/
        !           170: char *cmdstr(char *instr, char *fpath, char *fspec, char *outstr)
        !           171: {
        !           172:        static char static_cmd[128];
        !           173:        char str[256],str2[128],*cmd;
        !           174:     int i,j,len;
        !           175: 
        !           176: if(outstr==NULL)
        !           177:        cmd=static_cmd;
        !           178: else
        !           179:        cmd=outstr;
        !           180: len=strlen(instr);
        !           181: for(i=j=0;i<len && j<128;i++) {
        !           182:     if(instr[i]=='%') {
        !           183:         i++;
        !           184:         cmd[j]=0;
        !           185:         switch(toupper(instr[i])) {
        !           186:             case 'A':   /* User alias */
        !           187:                                strcat(cmd,user_name);
        !           188:                 break;
        !           189:             case 'B':   /* Baud (DTE) Rate */
        !           190:                                strcat(cmd,ultoa(com_rate,str,10));
        !           191:                 break;
        !           192:             case 'C':   /* Connect Description */
        !           193:                                strcat(cmd,ultoa(user_dce,str,10));
        !           194:                 break;
        !           195:             case 'F':   /* File path */
        !           196:                 strcat(cmd,fpath);
        !           197:                 break;
        !           198:             case 'G':   /* Temp directory */
        !           199:                                strcat(cmd,temp_dir);
        !           200:                 break;
        !           201:             case 'I':   /* UART IRQ Line */
        !           202:                 strcat(cmd,itoa(com_irq,str,10));
        !           203:                 break;
        !           204:             case 'J':
        !           205:                                strcat(cmd,data_dir);
        !           206:                 break;
        !           207:             case 'K':
        !           208:                                strcat(cmd,ctrl_dir);
        !           209:                 break;
        !           210:             case 'N':   /* Node Directory (same as SBBSNODE environment var) */
        !           211:                 strcat(cmd,node_dir);
        !           212:                 break;
        !           213:             case 'O':   /* SysOp */
        !           214:                 strcat(cmd,sys_op);
        !           215:                 break;
        !           216:             case 'P':   /* COM Port */
        !           217:                                strcat(cmd,itoa(com_port,str,10));
        !           218:                 break;
        !           219:             case 'Q':   /* QWK ID */
        !           220:                 strcat(cmd,sys_id);
        !           221:                 break;
        !           222:             case 'R':   /* Rows */
        !           223:                                strcat(cmd,itoa(user_rows,str,10));
        !           224:                 break;
        !           225:             case 'S':   /* File Spec */
        !           226:                 strcat(cmd,fspec);
        !           227:                 break;
        !           228:             case 'T':   /* Time left in seconds */
        !           229:                                strcat(cmd,itoa(time(NULL)-starttime,str,10));
        !           230:                 break;
        !           231:             case 'U':   /* UART I/O Address (in hex) */
        !           232:                 strcat(cmd,itoa(com_base,str,16));
        !           233:                 break;
        !           234:             case 'W':   /* Time-slice API type (mswtype) */
        !           235: #ifndef __OS2__
        !           236:                 strcat(cmd,itoa(mswtyp,str,10));
        !           237: #endif
        !           238:                 break;
        !           239:             case '&':   /* Address of msr */
        !           240:                                sprintf(str,"%lu",&riobp-1);
        !           241:                 strcat(cmd,str);
        !           242:                 break;
        !           243:                        case 'Z':
        !           244:                                strcat(cmd,text_dir);
        !           245:                 break;
        !           246:             case '!':   /* EXEC Directory */
        !           247:                                strcat(cmd,exec_dir);
        !           248:                 break;
        !           249:             case '#':   /* Node number (same as SBBSNNUM environment var) */
        !           250:                 sprintf(str,"%d",node_num);
        !           251:                 strcat(cmd,str);
        !           252:                 break;
        !           253:             case '*':
        !           254:                 sprintf(str,"%03d",node_num);
        !           255:                 strcat(cmd,str);
        !           256:                 break;
        !           257:             case '$':   /* Credits */
        !           258:                                strcat(cmd,ultoa(user_cdt,str,10));
        !           259:                 break;
        !           260:             case '%':   /* %% for percent sign */
        !           261:                 strcat(cmd,"%");
        !           262:                 break;
        !           263:             default:    /* unknown specification */
        !           264:                 if(isdigit(instr[i])) {
        !           265:                                        sprintf(str,"%0*d",instr[i]&0xf,user_number);
        !           266:                     strcat(cmd,str); }
        !           267:                 break; }
        !           268:         j=strlen(cmd); }
        !           269:     else
        !           270:         cmd[j++]=instr[i]; }
        !           271: cmd[j]=0;
        !           272: 
        !           273: return(cmd);
        !           274: }
        !           275: 
        !           276: char *base41(unsigned int i, char *str)
        !           277: {
        !           278:        char c;
        !           279:        unsigned int j=41*41,k;
        !           280: 
        !           281: for(c=0;c<3;c++) {
        !           282:        k=i/j;
        !           283:        str[c]='0'+k;
        !           284:        i-=(k*j);
        !           285:        j/=41;
        !           286:        if(str[c]>=':')
        !           287:                str[c]='A'+(str[c]-':');
        !           288:        if(str[c]>='[')
        !           289:                str[c]='#'+(str[c]-'['); }
        !           290: str[c]=0;
        !           291: return(str);
        !           292: }
        !           293: 
        !           294: /****************************************************************************/
        !           295: /* Updates 16-bit "rcrc" with character 'ch'                                */
        !           296: /****************************************************************************/
        !           297: void ucrc16(uchar ch, ushort *rcrc) {
        !           298:     ushort i, cy;
        !           299:     uchar nch=ch;
        !           300:  
        !           301: for (i=0; i<8; i++) {
        !           302:     cy=*rcrc & 0x8000;
        !           303:     *rcrc<<=1;
        !           304:     if (nch & 0x80) *rcrc |= 1;
        !           305:     nch<<=1;
        !           306:     if (cy) *rcrc ^= 0x1021; }
        !           307: }
        !           308: 
        !           309: /****************************************************************************/
        !           310: /* Returns 16-crc of string (not counting terminating NULL)                 */
        !           311: /****************************************************************************/
        !           312: ushort crc16(char *str)
        !           313: {
        !           314:     int     i=0;
        !           315:     ushort  crc=0;
        !           316: 
        !           317: ucrc16(0,&crc);
        !           318: while(str[i])
        !           319:     ucrc16(str[i++],&crc);
        !           320: ucrc16(0,&crc);
        !           321: ucrc16(0,&crc);
        !           322: return(crc);
        !           323: }
        !           324: 
        !           325: 
        !           326: int cdt_warning(long cdt)
        !           327: {
        !           328: if(cdt==0)
        !           329:        return(1);
        !           330: if(cdt>0) {
        !           331:        bprintf("\1m\1hYou will receive \1w%luk\1m in credits for this action!\r\n"
        !           332:                ,cdt/1024L);
        !           333:        return(1); }
        !           334: 
        !           335: bprintf("\1m\1hThis action will cost you \1w%luk\1m in credits.",(-cdt)/1024L);
        !           336: if(user_cdt+cdt_adjustment<-cdt) {
        !           337:        bprintf("\r\n\r\n\1r\1hSorry, you only have \1w%luk\1m in credits.\r\n"
        !           338:                ,(user_cdt+cdt_adjustment)/1024L);
        !           339:        return(0); }
        !           340: return(!noyes(" Continue"));
        !           341: }
        !           342: 
        !           343: void adjust_cdt(long cdt)
        !           344: {
        !           345: if(cdt==0)
        !           346:        return;
        !           347: cdt_adjustment+=cdt;
        !           348: }
        !           349: 
        !           350: int got_flags(char *req, char *got)
        !           351: {
        !           352:        int i,j;
        !           353: 
        !           354: for(i=0;req[i];i++) {
        !           355:        for(j=0;got[j];j++)
        !           356:                if(req[i]==got[j])
        !           357:                        break;
        !           358:        if(!got[j])
        !           359:                break; }
        !           360: if(!req[i])
        !           361:        return(1);
        !           362: return(0);
        !           363: }
        !           364: 
        !           365: int can_add()
        !           366: {
        !           367:        uchar age=getage(user_birth);
        !           368: 
        !           369: if(user_level<min_level || (age && getage(user_birth)<min_age)
        !           370:        || !got_flags(req_flags1,user_flags1)
        !           371:        || !got_flags(req_flags2,user_flags2)
        !           372:        || !got_flags(req_flags3,user_flags3)
        !           373:        || !got_flags(req_flags4,user_flags4)
        !           374:        )
        !           375:        return(0);
        !           376: return(1);
        !           377: }
        !           378: 
        !           379: 
        !           380: int trash(char *instr)
        !           381: {
        !           382:        char str[128],word[128];
        !           383: 
        !           384: if(!trashfile)
        !           385:        return(0);
        !           386: strcpy(str,instr);
        !           387: strupr(str);
        !           388: rewind(trashfile);
        !           389: while(!ferror(trashfile)) {
        !           390:        if(!fgets(word,125,trashfile))
        !           391:                break;
        !           392:        truncsp(word);
        !           393:        if(!word[0])
        !           394:                continue;
        !           395:        strupr(word);
        !           396:        if(strstr(str,word))
        !           397:                return(1); }
        !           398: return(0);
        !           399: }
        !           400: 
        !           401: long fdate_dir(char *filespec)
        !           402: {
        !           403:     struct ffblk f;
        !           404:     struct date fd;
        !           405:     struct time ft;
        !           406: 
        !           407: if(findfirst(filespec,&f,FA_RDONLY|FA_HIDDEN|FA_SYSTEM|FA_DIREC)==NULL) {
        !           408:        fd.da_day=f.ff_fdate&0x1f;
        !           409:        fd.da_mon=(f.ff_fdate>>5)&0xf;
        !           410:        fd.da_year=1980+((f.ff_fdate>>9)&0x7f);
        !           411:        ft.ti_hour=(f.ff_ftime>>11)&0x1f;
        !           412:        ft.ti_min=(f.ff_ftime>>5)&0x3f;
        !           413:        ft.ti_sec=(f.ff_ftime&0xf)*2;
        !           414:     return(dostounix(&fd,&ft)); }
        !           415: else return(NULL);
        !           416: }
        !           417: 
        !           418: /****************************************************************************/
        !           419: /* Generates a 24 character ASCII string that represents the time_t pointer */
        !           420: /* Used as a replacement for ctime()                                        */
        !           421: /****************************************************************************/
        !           422: char *timestr(time_t *intime)
        !           423: {
        !           424:     static char str[256];
        !           425:     char mer[3],hour;
        !           426:     struct tm *gm;
        !           427: 
        !           428: gm=localtime(intime);
        !           429: if(gm->tm_hour>=12) {
        !           430:     if(gm->tm_hour==12)
        !           431:         hour=12;
        !           432:     else
        !           433:         hour=gm->tm_hour-12;
        !           434:     strcpy(mer,"pm"); }
        !           435: else {
        !           436:     if(gm->tm_hour==0)
        !           437:         hour=12;
        !           438:     else
        !           439:         hour=gm->tm_hour;
        !           440:     strcpy(mer,"am"); }
        !           441: sprintf(str,"%s %s %02d %4d %02d:%02d %s"
        !           442:     ,wday[gm->tm_wday],mon[gm->tm_mon],gm->tm_mday,1900+gm->tm_year
        !           443:     ,hour,gm->tm_min,mer);
        !           444: return(str);
        !           445: }
        !           446: 
        !           447: 
        !           448: void puttgram(int usernumber, char *strin)
        !           449: {
        !           450:        char str[256];
        !           451:        int file,i;
        !           452: 
        !           453: sprintf(str,"%4.4u.MSG",usernumber);
        !           454: if((file=nopen(str,O_WRONLY|O_CREAT|O_APPEND))==-1) {
        !           455:        printf("\7Error opening/creating %s for creat/append access\n",str);
        !           456:        return; }
        !           457: i=strlen(strin);
        !           458: if(write(file,strin,i)!=i) {
        !           459:        close(file);
        !           460:        printf("\7Error writing %u bytes to %s\n",i,str);
        !           461:        return; }
        !           462: close(file);
        !           463: }
        !           464: 
        !           465: 
        !           466: int send_telegram(user_t user)
        !           467: {
        !           468:        uchar str[256],line[256],buf[1024];
        !           469:        int i;
        !           470: 
        !           471: if(!useron.number) {
        !           472:        bputs("\r\n\1h\1rYou must create a profile first.\r\n");
        !           473:        pause();
        !           474:        return(1); }
        !           475: 
        !           476: if(user_level<telegram_level) {
        !           477:        bputs("\r\n\1h\1rYou have insufficient access to send telegrams."
        !           478:                "\r\n");
        !           479:        pause();
        !           480:        return(1); }
        !           481: 
        !           482: main_user_info(user);
        !           483: CRLF;
        !           484: if(!cdt_warning(telegram_cdt))
        !           485:        return(0);
        !           486: if(telegram_cdt)
        !           487:        CRLF;
        !           488: bprintf("\1n\1hSending a telegram to \1y%s\1w:\r\n\r\n"
        !           489:        ,user.name);
        !           490: now=time(NULL);
        !           491: memset(buf,0,512);
        !           492: sprintf(buf,"\1n\1c\1hMatch Maker\1b telegram from \1c%s\1b "
        !           493:        "on %s:\1y\r\n"
        !           494:        ,useron.name,timestr(&now));
        !           495: for(i=0;i<5 && !aborted;i++) {
        !           496:        bprintf("\1n\1h\1g%u of 5: \1n\1g",i+1);
        !           497:        if(!getstr(line,70,i==4 ? K_MSG:K_MSG|K_WRAP))
        !           498:                break;
        !           499:        sprintf(str,"\1n\1g%4s%s\r\n",nulstr,line);
        !           500:        strcat(buf,str); }
        !           501: if(!i || aborted || !yesno("\r\nSave"))
        !           502:        return(0);
        !           503: if(!(user.misc&USER_FROMSMB)) {
        !           504:        putsmsg(user.number,TGRAM_NOTICE);
        !           505:        puttgram(user.number,buf); }
        !           506: else {
        !           507:        if((i=nopen("TELEGRAM.DAB",O_WRONLY|O_CREAT|O_APPEND|SH_DENYNO))
        !           508:                ==-1) {
        !           509:                bprintf("\r\n\1r\1h\1iError writing telegram!\r\n");
        !           510:                pause();
        !           511:                return(1); }
        !           512:        write(i,useron.system,sizeof(useron.system));
        !           513:        write(i,user.system,sizeof(user.system));
        !           514:        write(i,&user.number,sizeof(user.number));
        !           515:        write(i,buf,512);
        !           516:        close(i); }
        !           517: adjust_cdt(telegram_cdt);
        !           518: if(notify_user && notify_user!=user_number) {
        !           519:        sprintf(str,"\1n\1hSMM: \1y%s\1m sent a telegram to \1y%s\1m "
        !           520:                "from the Match Maker\r\n",user_name,user.name);
        !           521:        if(node_dir[0])
        !           522:                putsmsg(notify_user,str);
        !           523:        else
        !           524:                puttgram(notify_user,str); }
        !           525: return(1);
        !           526: }
        !           527: 
        !           528: /****************************************************************************/
        !           529: /* Returns 32-crc of string (not counting terminating NULL)                            */
        !           530: /****************************************************************************/
        !           531: ulong crc32(char *str)
        !           532: {
        !           533:        int i=0;
        !           534:        ulong crc=0xffffffffUL;
        !           535: 
        !           536:        while(str[i])
        !           537:                crc=ucrc32(str[i++],crc);
        !           538:        crc=~crc;
        !           539:        return(crc);
        !           540: }
        !           541: 
        !           542: 
        !           543: /****************************************************************************/
        !           544: /* Converts unix time format (long - time_t) into a char str MM/DD/YY          */
        !           545: /****************************************************************************/
        !           546: char *unixtodstr(time_t unix, char *str)
        !           547: {
        !           548: 
        !           549: if(!unix)
        !           550:        strcpy(str,"00/00/00");
        !           551: else {
        !           552:        unixtodos(unix,&date,&curtime);
        !           553:        if((unsigned)date.da_mon>12) {    /* DOS leap year bug */
        !           554:                date.da_mon=1;
        !           555:                date.da_year++; }
        !           556:        if((unsigned)date.da_day>31)
        !           557:                date.da_day=1;
        !           558:        sprintf(str,"%02u/%02u/%02u",date.da_mon,date.da_day
        !           559:                ,date.da_year>=2000 ? date.da_year-2000 : date.da_year-1900); }
        !           560: return(str);
        !           561: }
        !           562: 
        !           563: /****************************************************************************/
        !           564: /* Converts a date string in format MM/DD/YY into unix time format                     */
        !           565: /****************************************************************************/
        !           566: time_t dstrtounix(char *str)
        !           567: {
        !           568: 
        !           569: if(!strcmp(str,"00/00/00") || !str[0])
        !           570:        return(NULL);
        !           571: curtime.ti_hour=curtime.ti_min=curtime.ti_sec=0;
        !           572: if(str[6]<'7')
        !           573:        date.da_year=2000+((str[6]&0xf)*10)+(str[7]&0xf);
        !           574: else
        !           575:        date.da_year=1900+((str[6]&0xf)*10)+(str[7]&0xf);
        !           576: date.da_mon=((str[0]&0xf)*10)+(str[1]&0xf);
        !           577: date.da_day=((str[3]&0xf)*10)+(str[4]&0xf);
        !           578: return(dostounix(&date,&curtime));
        !           579: }
        !           580: 
        !           581: /****************************************************************************/
        !           582: /* Returns the age derived from the string 'birth' in the format MM/DD/YY      */
        !           583: /****************************************************************************/
        !           584: char getage(char *birth)
        !           585: {
        !           586:        char age;
        !           587: 
        !           588: if(birth[0]<=SP)
        !           589:        return(0);
        !           590: getdate(&date);
        !           591: age=(date.da_year-1900)-(((birth[6]&0xf)*10)+(birth[7]&0xf));
        !           592: if(atoi(birth)>12 || atoi(birth+3)>31)
        !           593:        return(0);
        !           594: if(((birth[0]&0xf)*10)+(birth[1]&0xf)>date.da_mon ||
        !           595:        (((birth[0]&0xf)*10)+(birth[1]&0xf)==date.da_mon &&
        !           596:        ((birth[3]&0xf)*10)+(birth[4]&0xf)>date.da_day))
        !           597:        age--;
        !           598: if(age<0)
        !           599:        return(0);
        !           600: return(age);
        !           601: }
        !           602: 
        !           603: char marital_ch(char user_marital)
        !           604: {
        !           605: switch(user_marital) {
        !           606:        case MARITAL_SINGLE:
        !           607:                return('S');
        !           608:        case MARITAL_DIVORCED:
        !           609:                return('D');
        !           610:        case MARITAL_MARRIED:
        !           611:                return('M');
        !           612:        case MARITAL_WIDOWED:
        !           613:                return('W');
        !           614:        case MARITAL_OTHER:
        !           615:                return('O'); }
        !           616: if(user_marital)
        !           617:        return('*');
        !           618: return(SP);
        !           619: }
        !           620: 
        !           621: char race_ch(char user_race)
        !           622: {
        !           623: switch(user_race) {
        !           624:        case RACE_WHITE:
        !           625:                return('W');
        !           626:        case RACE_BLACK:
        !           627:                return('B');
        !           628:        case RACE_HISPANIC:
        !           629:                return('H');
        !           630:        case RACE_AMERINDIAN:
        !           631:                return('I');
        !           632:        case RACE_ASIAN:
        !           633:                return('A');
        !           634:        case RACE_MIDEASTERN:
        !           635:                return('M');
        !           636:        case RACE_OTHER:
        !           637:                return('O'); }
        !           638: if(user_race)
        !           639:        return('*');
        !           640: return(SP);
        !           641: }
        !           642: 
        !           643: char *hair(char user_hair)
        !           644: {
        !           645: switch(user_hair) {
        !           646:        case HAIR_BLONDE:
        !           647:                return("BLN");
        !           648:        case HAIR_BROWN:
        !           649:                return("BRN");
        !           650:        case HAIR_RED:
        !           651:                return("RED");
        !           652:        case HAIR_BLACK:
        !           653:                return("BLK");
        !           654:        case HAIR_GREY:
        !           655:                return("GRY");
        !           656:        case HAIR_OTHER:
        !           657:                return("OTH"); }
        !           658: if(user_hair)
        !           659:        return("*");
        !           660: return(nulstr);
        !           661: }
        !           662: 
        !           663: char *eyes(char user_eyes)
        !           664: {
        !           665: switch(user_eyes) {
        !           666:        case EYES_BLUE:
        !           667:                return("BLU");
        !           668:        case EYES_BROWN:
        !           669:                return("BRN");
        !           670:        case EYES_GREEN:
        !           671:                return("GRN");
        !           672:        case EYES_HAZEL:
        !           673:                return("HAZ");
        !           674:        case EYES_OTHER:
        !           675:                return("OTH"); }
        !           676: if(user_eyes)
        !           677:        return("*");
        !           678: return(nulstr);
        !           679: }
        !           680: 
        !           681: char *marital(char user_marital)
        !           682: {
        !           683: switch(user_marital) {
        !           684:     case MARITAL_SINGLE:
        !           685:                return("Single");
        !           686:     case MARITAL_MARRIED:
        !           687:                return("Married");
        !           688:     case MARITAL_DIVORCED:
        !           689:                return("Divorced");
        !           690:     case MARITAL_WIDOWED:
        !           691:                return("Widowed");
        !           692:        case MARITAL_OTHER:
        !           693:                return("Other"); }
        !           694: if(user_marital)
        !           695:        return("*");
        !           696: return(nulstr);
        !           697: }
        !           698: 
        !           699: char *race(char user_race)
        !           700: {
        !           701: switch(user_race) {
        !           702:        case RACE_WHITE:
        !           703:                return("White");
        !           704:        case RACE_BLACK:
        !           705:                return("Black");
        !           706:        case RACE_HISPANIC:
        !           707:                return("Hispanic");
        !           708:        case RACE_ASIAN:
        !           709:                return("Asian");
        !           710:        case RACE_AMERINDIAN:
        !           711:                return("American Indian");
        !           712:        case RACE_MIDEASTERN:
        !           713:                return("Middle Eastern");
        !           714:        case RACE_OTHER:
        !           715:                return("Other"); }
        !           716: if(user_race)
        !           717:        return("*");
        !           718: return(nulstr);
        !           719: }
        !           720: 
        !           721: ushort getzodiac(char *birth)
        !           722: {
        !           723: if((!strncmp(birth,"03",2) && atoi(birth+3)>=21)
        !           724:        || (!strncmp(birth,"04",2) && atoi(birth+3)<=19))
        !           725:     return(ZODIAC_ARIES);
        !           726: if((!strncmp(birth,"04",2) && atoi(birth+3)>=20)
        !           727:        || (!strncmp(birth,"05",2) && atoi(birth+3)<=20))
        !           728:        return(ZODIAC_TAURUS);
        !           729: if((!strncmp(birth,"05",2) && atoi(birth+3)>=21)
        !           730:        || (!strncmp(birth,"06",2) && atoi(birth+3)<=20))
        !           731:        return(ZODIAC_GEMINI);
        !           732: if((!strncmp(birth,"06",2) && atoi(birth+3)>=21)
        !           733:        || (!strncmp(birth,"07",2) && atoi(birth+3)<=22))
        !           734:        return(ZODIAC_CANCER);
        !           735: if((!strncmp(birth,"07",2) && atoi(birth+3)>=23)
        !           736:        || (!strncmp(birth,"08",2) && atoi(birth+3)<=22))
        !           737:        return(ZODIAC_LEO);
        !           738: if((!strncmp(birth,"08",2) && atoi(birth+3)>=23)
        !           739:        || (!strncmp(birth,"09",2) && atoi(birth+3)<=22))
        !           740:        return(ZODIAC_VIRGO);
        !           741: if((!strncmp(birth,"09",2) && atoi(birth+3)>=23)
        !           742:        || (!strncmp(birth,"10",2) && atoi(birth+3)<=22))
        !           743:        return(ZODIAC_LIBRA);
        !           744: if((!strncmp(birth,"10",2) && atoi(birth+3)>=23)
        !           745:        || (!strncmp(birth,"11",2) && atoi(birth+3)<=21))
        !           746:        return(ZODIAC_SCORPIO);
        !           747: if((!strncmp(birth,"11",2) && atoi(birth+3)>=22)
        !           748:        || (!strncmp(birth,"12",2) && atoi(birth+3)<=21))
        !           749:        return(ZODIAC_SAGITTARIUS);
        !           750: if((!strncmp(birth,"12",2) && atoi(birth+3)>=22)
        !           751:        || (!strncmp(birth,"01",2) && atoi(birth+3)<=19))
        !           752:        return(ZODIAC_CAPRICORN);
        !           753: if((!strncmp(birth,"01",2) && atoi(birth+3)>=20)
        !           754:        || (!strncmp(birth,"02",2) && atoi(birth+3)<=18))
        !           755:        return(ZODIAC_AQUARIUS);
        !           756: if((!strncmp(birth,"02",2) && atoi(birth+3)>=19)
        !           757:        || (!strncmp(birth,"03",2) && atoi(birth+3)<=20))
        !           758:        return(ZODIAC_PISCES);
        !           759: return(0xff);
        !           760: }
        !           761: 
        !           762: char *zodiac(short user_zodiac)
        !           763: {
        !           764: switch(user_zodiac)
        !           765: {
        !           766:        case ZODIAC_ARIES:
        !           767:                return("Aries");
        !           768:        case ZODIAC_TAURUS:
        !           769:                return("Taurus");
        !           770:        case ZODIAC_GEMINI:
        !           771:                return("Gemini");
        !           772:        case ZODIAC_CANCER:
        !           773:                return("Cancer");
        !           774:        case ZODIAC_LEO:
        !           775:                return("Leo");
        !           776:        case ZODIAC_VIRGO:
        !           777:                return("Virgo");
        !           778:        case ZODIAC_LIBRA:
        !           779:                return("Libra");
        !           780:        case ZODIAC_SCORPIO:
        !           781:                return("Scorpio");
        !           782:        case ZODIAC_SAGITTARIUS:
        !           783:                return("Sagittarius");
        !           784:        case ZODIAC_CAPRICORN:
        !           785:                return("Capricorn");
        !           786:        case ZODIAC_AQUARIUS:
        !           787:                return("Aquarius");
        !           788:        case ZODIAC_PISCES:
        !           789:                return("Pisces"); }
        !           790: return(nulstr);
        !           791: }
        !           792: 
        !           793: short ans2bits(char *str)
        !           794: {
        !           795:        int i,j;
        !           796:        ushort bits=0;
        !           797: 
        !           798: j=strlen(str);
        !           799: for(i=0;i<j;i++) {
        !           800:        if(str[i]=='*')
        !           801:                return(0xffff);
        !           802:        bits|=(1<<str[i]-'A'); }
        !           803: return(bits);
        !           804: }
        !           805: 
        !           806: uchar ans2uchar(char *str)
        !           807: {
        !           808:        int i,j;
        !           809:        uchar bits=0;
        !           810: 
        !           811: j=strlen(str);
        !           812: for(i=0;i<j;i++) {
        !           813:        if(str[i]=='*')
        !           814:                return(0xff);
        !           815:        bits|=(1<<str[i]-'A'); }
        !           816: return(bits);
        !           817: }
        !           818: 
        !           819: 
        !           820: void bits2ans(ushort bits, char *str)
        !           821: {
        !           822:        char    tmp[25];
        !           823:        int     i;
        !           824: 
        !           825: str[0]=0;
        !           826: if(bits==0xffff) {
        !           827:        strcpy(str,"*");
        !           828:        return; }
        !           829: for(i=0;i<16;i++)
        !           830:        if(bits&(1<<i)) {
        !           831:                tmp[0]='A'+i;
        !           832:                tmp[1]=0;
        !           833:                strcat(str,tmp); }
        !           834: }
        !           835: 
        !           836: void bits2str(ushort user, char *str)
        !           837: {
        !           838:        int     i;
        !           839: 
        !           840: str[0]=0;
        !           841: if(user==0xffff) {
        !           842:        strcpy(str,"*");
        !           843:        return; }
        !           844: for(i=0;i<16;i++)
        !           845:        if(user&(1<<i))
        !           846:                str[i]='A'+i;
        !           847:        else
        !           848:                str[i]=SP;
        !           849: str[i]=0;
        !           850: }
        !           851: 
        !           852: void uchar2ans(uchar bits, char *str)
        !           853: {
        !           854:        char    tmp[25];
        !           855:        int     i;
        !           856: 
        !           857: str[0]=0;
        !           858: if(bits==0xff) {
        !           859:        strcpy(str,"*");
        !           860:        return; }
        !           861: for(i=0;i<8;i++)
        !           862:        if(bits&(1<<i)) {
        !           863:                tmp[0]='A'+i;
        !           864:                tmp[1]=0;
        !           865:                strcat(str,tmp); }
        !           866: }
        !           867: 
        !           868: int basic_match(user_t user, user_t mate)
        !           869: {
        !           870:        int max=0,match=0,age=getage(mate.birth),zodiac=getzodiac(mate.birth);
        !           871: 
        !           872: if(user.pref_sex!='*' && user.pref_sex!=mate.sex
        !           873:        && !(user.misc&USER_FRIEND))
        !           874:        return(0);
        !           875: 
        !           876: if(zodiac&user.pref_zodiac) match++;
        !           877: else if(user.misc&USER_REQZODIAC)
        !           878:        return(0);
        !           879: if(zodiac==user.pref_zodiac) match++;
        !           880: max+=2;
        !           881: 
        !           882: if(stricmp(mate.zipcode,user.min_zipcode)>=0
        !           883:        && stricmp(mate.zipcode,user.max_zipcode)<=0) match+=2;
        !           884: else if(user.misc&USER_REQZIP) return(0);
        !           885: max+=2;
        !           886: 
        !           887: if(mate.marital&user.pref_marital) match++;
        !           888: else if(user.misc&USER_REQMARITAL)
        !           889:        return(0);
        !           890: if(mate.marital==user.pref_marital) match++;
        !           891: max+=2;
        !           892: 
        !           893: if(mate.race&user.pref_race) match++;
        !           894: else if(user.misc&USER_REQRACE)
        !           895:        return(0);
        !           896: if(mate.race==user.pref_race) match++;
        !           897: max+=2;
        !           898: 
        !           899: if(mate.hair&user.pref_hair) match++;
        !           900: else if(user.misc&USER_REQHAIR)
        !           901:        return(0);
        !           902: if(mate.hair==user.pref_hair) match++;
        !           903: max+=2;
        !           904: 
        !           905: if(mate.eyes&user.pref_eyes) match++;
        !           906: else if(user.misc&USER_REQEYES)
        !           907:        return(0);
        !           908: if(mate.eyes==user.pref_eyes) match++;
        !           909: max+=2;
        !           910: 
        !           911: if(age>=user.min_age
        !           912:        && (!user.max_age || age<=user.max_age)) match+=2;
        !           913: else {
        !           914:        if(user.misc&USER_REQAGE) return(0);
        !           915:        if(age<user.min_age-((user.max_age-user.min_age)/2)
        !           916:                || (user.max_age && age>user.max_age+((user.max_age-user.min_age)/2)))
        !           917:                match-=4;
        !           918:        else if(age<user.min_age-((user.max_age-user.min_age)/3)
        !           919:                || (user.max_age && age>user.max_age+((user.max_age-user.min_age)/3)))
        !           920:                match-=3;
        !           921:        else if(age<user.min_age-((user.max_age-user.min_age)/4)
        !           922:                || (user.max_age && age>user.max_age+((user.max_age-user.min_age)/4)))
        !           923:                match-=2;
        !           924:        else if(age<user.min_age-((user.max_age-user.min_age)/5)
        !           925:                || (user.max_age && age>user.max_age+((user.max_age-user.min_age)/5)))
        !           926:                match--; }
        !           927: 
        !           928: max+=2;
        !           929: 
        !           930: if(mate.weight>=user.min_weight
        !           931:        && (!user.max_weight || mate.weight<=user.max_weight)) match+=2;
        !           932: else {
        !           933:        if(user.misc&USER_REQWEIGHT) return(0);
        !           934:        if(mate.weight<user.min_weight-((user.max_weight-user.min_weight)/2)
        !           935:                || (user.max_weight
        !           936:                && mate.weight>user.max_weight+((user.max_weight-user.min_weight)/2)))
        !           937:                match-=4;
        !           938:        else if(mate.weight<user.min_weight-((user.max_weight-user.min_weight)/3)
        !           939:                || (user.max_weight
        !           940:                && mate.weight>user.max_weight+((user.max_weight-user.min_weight)/3)))
        !           941:                match-=3;
        !           942:        else if(mate.weight<user.min_weight-((user.max_weight-user.min_weight)/4)
        !           943:                || (user.max_weight
        !           944:                && mate.weight>user.max_weight+((user.max_weight-user.min_weight)/4)))
        !           945:                match-=2;
        !           946:        else if(mate.weight<user.min_weight-((user.max_weight-user.min_weight)/5)
        !           947:                || (user.max_weight
        !           948:                && mate.weight>user.max_weight+((user.max_weight-user.min_weight)/5)))
        !           949:                match--; }
        !           950: max+=2;
        !           951: 
        !           952: if(mate.height>=user.min_height
        !           953:        && (!user.max_height || mate.height<=user.max_height)) match+=2;
        !           954: else {
        !           955:        if(user.misc&USER_REQHEIGHT) return(0);
        !           956:        if(mate.height<user.min_height-((user.max_height-user.min_height)/2)
        !           957:                || (user.max_height
        !           958:                && mate.height>user.max_height+((user.max_height-user.min_height)/2)))
        !           959:                match-=4;
        !           960:        else if(mate.height<user.min_height-((user.max_height-user.min_height)/3)
        !           961:                || (user.max_height
        !           962:                && mate.height>user.max_height+((user.max_height-user.min_height)/3)))
        !           963:                match-=3;
        !           964:        else if(mate.height<user.min_height-((user.max_height-user.min_height)/4)
        !           965:                || (user.max_height
        !           966:                && mate.height>user.max_height+((user.max_height-user.min_height)/4)))
        !           967:                match-=2;
        !           968:        else if(mate.height<user.min_height-((user.max_height-user.min_height)/5)
        !           969:                || (user.max_height
        !           970:                && mate.height>user.max_height+((user.max_height-user.min_height)/5)))
        !           971:                match--; }
        !           972: max+=2;
        !           973: 
        !           974: if(mate.income>=user.min_income
        !           975:        && (!user.max_income || mate.income==0xffffffffUL
        !           976:        || mate.income<=user.max_income)) match++;
        !           977: else {
        !           978:        if(user.misc&USER_REQINCOME) return(0);
        !           979:        if(mate.income<user.min_income-((user.max_income-user.min_income)/2)
        !           980:                || (user.max_income
        !           981:                && mate.income>user.max_income+((user.max_income-user.min_income)/2)))
        !           982:                match-=4;
        !           983:        else if(mate.income<user.min_income-((user.max_income-user.min_income)/3)
        !           984:                || (user.max_income
        !           985:                && mate.income>user.max_income+((user.max_income-user.min_income)/3)))
        !           986:                match-=3;
        !           987:        else if(mate.income<user.min_income-((user.max_income-user.min_income)/4)
        !           988:                || (user.max_income
        !           989:                && mate.income>user.max_income+((user.max_income-user.min_income)/4)))
        !           990:                match-=2;
        !           991:        else if(mate.income<user.min_income-((user.max_income-user.min_income)/5)
        !           992:                || (user.max_income
        !           993:                && mate.income>user.max_income+((user.max_income-user.min_income)/5)))
        !           994:                match--; }
        !           995: max++;
        !           996: 
        !           997: if(match<=0)
        !           998:        return(0);
        !           999: 
        !          1000: return(((float)match/max)*100.0);
        !          1001: }
        !          1002: 
        !          1003: int sys_quenum(char *name)
        !          1004: {
        !          1005:        int i;
        !          1006: 
        !          1007: for(i=0;i<total_ques;i++)
        !          1008:        if(!stricmp(que[i]->name,name))
        !          1009:                break;
        !          1010: if(i<total_ques)
        !          1011:        return(i);
        !          1012: return(-1);
        !          1013: }
        !          1014: 
        !          1015: int user_quenum(char *name, user_t user)
        !          1016: {
        !          1017:        int i;
        !          1018: 
        !          1019: for(i=0;i<5;i++)
        !          1020:        if(!stricmp(user.queans[i].name,name))
        !          1021:                break;
        !          1022: if(i<5)
        !          1023:        return(i);
        !          1024: return(-1);
        !          1025: }
        !          1026: 
        !          1027: int total_match(user_t user, user_t mate)
        !          1028: {
        !          1029:        int i,j,s,u,match1,match2,quematches=0,quemax=0,quematch;
        !          1030: 
        !          1031: match1=basic_match(user,mate);
        !          1032: if(!match1) return(0);
        !          1033: match2=basic_match(mate,user);
        !          1034: if(!match2) return(0);
        !          1035: 
        !          1036: for(i=0;i<5;i++) {
        !          1037:        if(!user.queans[i].name[0])
        !          1038:                continue;
        !          1039:        s=sys_quenum(user.queans[i].name);
        !          1040:        if(s==-1)
        !          1041:                continue;
        !          1042:        u=user_quenum(user.queans[i].name,mate);
        !          1043:        if(u==-1)
        !          1044:                continue;
        !          1045:        for(j=0;j<que[s]->total_ques;j++) {
        !          1046:                if(user.queans[u].pref[j]&mate.queans[i].self[j]) quematches+=4;
        !          1047:                if(user.queans[u].pref[j]==mate.queans[i].self[j]) quematches+=2;
        !          1048:                if(user.queans[u].self[j]&mate.queans[i].pref[j]) quematches+=2;
        !          1049:                if(user.queans[u].self[j]==mate.queans[i].pref[j]) quematches++;
        !          1050:                quemax+=9; } }
        !          1051: 
        !          1052: if(!quemax)    /* no questionnaires in common */
        !          1053:        return((match1+match1+match1+match1+match2+match2)/6);
        !          1054: 
        !          1055: quematch=((float)quematches/quemax)*100.0;
        !          1056: return((match1+match1+match1+match1+match2+match2+quematch)/7);
        !          1057: }
        !          1058: 
        !          1059: 
        !          1060: void main_user_info(user_t user)
        !          1061: {
        !          1062:        char str[128],min[64],max[64];
        !          1063:        int i;
        !          1064: 
        !          1065: attr(LIGHTGRAY);
        !          1066: cls();
        !          1067: if(SYSOP)
        !          1068:        bprintf("\1n\1gReal: \1h%.25s #%lu (%.40s)\r\n"
        !          1069:                ,user.realname,user.number,user.system);
        !          1070: bprintf("\1n\1gName: \1h%-25.25s     \1b%-10s   \1c%-15s  \1m%s\r\n"
        !          1071:        ,user.name
        !          1072:        ,marital(user.marital),race(user.race)
        !          1073:        ,user.sex=='M' ? "Male":"Female");
        !          1074: if(smm_misc&SMM_METRIC)
        !          1075:        sprintf(str," %-4u",intocm(user.height));
        !          1076: else
        !          1077:        sprintf(str,"%2u'%-2u",user.height/12,user.height%12);
        !          1078: bprintf("\1n\1gHair: \1h%3s  \1n\1gEyes: \1h%3s  \1n\1gHeight:"
        !          1079:        "\1h%s  \1n\1gWeight: \1h%-3u  \1n\1gAge: \1h%-3u "
        !          1080:     "\1n\1gZodiac: \1h%s\r\n"
        !          1081:        ,hair(user.hair),eyes(user.eyes),str
        !          1082:        ,smm_misc&SMM_METRIC ? lptokg(user.weight) : user.weight
        !          1083:        ,getage(user.birth),zodiac(getzodiac(user.birth)));
        !          1084: bprintf("\1n\1gFrom: \1h%-30.30s   \1n\1gZip: \1h%-10.10s    "
        !          1085:        "\1n\1gIncome: \1h$%sK\1n\1g/year\r\n"
        !          1086:        ,user.location,user.zipcode
        !          1087:        ,user.income==0xffffffffUL ? "?":ultoa(user.income/1000UL,tmp,10));
        !          1088: if(smm_misc&SMM_METRIC) {
        !          1089:        sprintf(min,"%u",intocm(user.min_height));
        !          1090:        sprintf(max,"%u",intocm(user.max_height)); }
        !          1091: else {
        !          1092:        sprintf(min,"%u'%u",user.min_height/12,user.min_height%12);
        !          1093:        sprintf(max,"%u'%u",user.max_height/12,user.max_height%12); }
        !          1094: bprintf("\1n\1gPref: \1h\1%c%c\1%c%c\1m%c \1%c%3u\1n\1g-\1h\1%c%u\1n\1h  "
        !          1095:        "\1%c%s \1n\1ghair  \1h\1%c%s \1n\1geyes  \1h\1%c%s\1n\1g-\1h\1%c%s  "
        !          1096:        "\1%c%u\1n\1g-\1h\1%c%u\1n\1glbs  \1h\1%c$%luK\1n\1g-\1h\1%c%luK\1n\1%c  "
        !          1097:        "\1h%.3s\r\n"
        !          1098:        ,user.misc&USER_REQMARITAL ? 'w':'b'
        !          1099:        ,marital_ch(user.pref_marital)
        !          1100:        ,user.misc&USER_REQRACE ? 'w':'g'
        !          1101:        ,race_ch(user.pref_race)
        !          1102:        ,user.pref_sex
        !          1103:        ,user.misc&USER_REQAGE  ? 'w':'g'
        !          1104:        ,user.min_age
        !          1105:        ,user.misc&USER_REQAGE  ? 'w':'g'
        !          1106:        ,user.max_age
        !          1107:        ,user.misc&USER_REQHAIR  ? 'w':'g'
        !          1108:        ,hair(user.pref_hair)
        !          1109:        ,user.misc&USER_REQEYES  ? 'w':'g'
        !          1110:        ,eyes(user.pref_eyes)
        !          1111:        ,user.misc&USER_REQHEIGHT  ? 'w':'g'
        !          1112:        ,min
        !          1113:        ,user.misc&USER_REQHEIGHT  ? 'w':'g'
        !          1114:        ,max
        !          1115:        ,user.misc&USER_REQWEIGHT  ? 'w':'g'
        !          1116:        ,smm_misc&SMM_METRIC ? lptokg(user.min_weight) : user.min_weight
        !          1117:        ,user.misc&USER_REQWEIGHT  ? 'w':'g'
        !          1118:        ,smm_misc&SMM_METRIC ? lptokg(user.max_weight) : user.max_weight
        !          1119:        ,user.misc&USER_REQINCOME  ? 'w':'g'
        !          1120:        ,user.min_income/1000L
        !          1121:        ,user.misc&USER_REQINCOME  ? 'w':'g'
        !          1122:        ,user.max_income/1000L
        !          1123:        ,user.misc&USER_REQZODIAC  ? 'w':'g'
        !          1124:     ,zodiac(user.pref_zodiac));
        !          1125: 
        !          1126: bprintf("\1r\1i%s\1n\1w\1h\r\n",user.misc&USER_PHOTO ? "PHOTO":nulstr);
        !          1127: for(i=0;i<5;i++) {
        !          1128:     if(!user.note[i][0])
        !          1129:         break;
        !          1130:        bprintf("%15s%.50s\r\n",nulstr,user.note[i]); }
        !          1131: }
        !          1132: 
        !          1133: char long_user_info(user_t user)
        !          1134: {
        !          1135:        char str[128],fname[128],path[128],ch;
        !          1136:        int i,j,k,s,u,max,match1,match2,user_match,mate_match;
        !          1137: 
        !          1138: while(1) {
        !          1139: checkline();
        !          1140: main_user_info(user);
        !          1141: 
        !          1142: CRLF;
        !          1143: /**
        !          1144: if(user.misc&USER_FROMSMB)
        !          1145:        bprintf("\1r\1hImported via message base from \1w%s\1r.\r\n"
        !          1146:                ,user.system);
        !          1147: **/
        !          1148: bprintf("\1h\1mThis user meets your profile preferences:\1w%3u%%            "
        !          1149:        ,match1=basic_match(useron,user));
        !          1150: bprintf("\1n\1gCreated: \1h%s\r\n",unixtodstr(user.created,str));
        !          1151: bprintf("\1h\1mYou meet this user's profile preferences:\1w%3u%%            "
        !          1152:        ,match2=basic_match(user,useron));
        !          1153: bprintf("\1n\1gUpdated: \1h%s\r\n",unixtodstr(user.updated,str));
        !          1154: 
        !          1155: if(!smm_pause)
        !          1156:        lncntr=0;
        !          1157: 
        !          1158: CRLF;
        !          1159: bputs("\1n\1b\1hQuestionnaires:\r\n");
        !          1160: for(i=0;i<5;i++) {
        !          1161:        max=mate_match=user_match=0;
        !          1162:        if(!user.queans[i].name[0])
        !          1163:                continue;
        !          1164:        s=sys_quenum(user.queans[i].name);
        !          1165:        if(s==-1)
        !          1166:                continue;
        !          1167:        if(que[s]->req_age>getage(useron.birth))
        !          1168:                continue;
        !          1169:        if(match1 && match2)
        !          1170:                u=user_quenum(user.queans[i].name,useron);
        !          1171:        else
        !          1172:                u=-1;
        !          1173:        bprintf("\1h\1c%-25s ",que[s]->desc);
        !          1174:        if(u==-1) {
        !          1175:                CRLF;
        !          1176:                continue; }
        !          1177:        for(j=0;j<que[s]->total_ques;j++) {
        !          1178:                if(useron.queans[u].pref[j]&user.queans[i].self[j]) user_match+=2;
        !          1179:                if(useron.queans[u].pref[j]==user.queans[i].self[j]) user_match++;
        !          1180:                if(useron.queans[u].self[j]&user.queans[i].pref[j]) mate_match+=2;
        !          1181:                if(useron.queans[u].self[j]==user.queans[i].pref[j]) mate_match++;
        !          1182:                max+=3; }
        !          1183:        bprintf("\1n\1c%s matches your pref:\1h%3u%%  "
        !          1184:                        "\1n\1cYou match %s pref:\1h%3u%%\r\n"
        !          1185:                        ,user.sex=='M' ? "He":"She"
        !          1186:                        ,(int)(((float)user_match/max)*100.0)
        !          1187:                        ,user.sex=='M' ? "his":"her"
        !          1188:                        ,(int)(((float)mate_match/max)*100.0)); }
        !          1189: 
        !          1190: bprintf("\r\n\1r\1hOverall match: \1w%u%%",total_match(useron,user));
        !          1191: if(user.purity)
        !          1192:        bprintf("        \1r\1hPurity test: \1w%u%%",user.purity);
        !          1193: if(user.mbtype[0])
        !          1194:        bprintf("        \1r\1hPersonality type: \1w%s",user.mbtype);
        !          1195: CRLF;
        !          1196: 
        !          1197: if(aborted) {
        !          1198:        aborted=0;
        !          1199:        return(0); }
        !          1200: if(!smm_pause) {
        !          1201:        if(kbhit())
        !          1202:                return(0);
        !          1203:        return(1); }
        !          1204: nodesync();
        !          1205: if(lncntr>=user_rows-2)
        !          1206:     lncntr=0;
        !          1207: CRLF;
        !          1208: bputs("\1h\1b[\1cV\1b]iew questionnaires, ");
        !          1209: if(user.misc&USER_PHOTO)
        !          1210:        bputs("[\1cD\1b]ownload photo, ");
        !          1211: bputs("[\1cS\1b]end telegram, [\1cQ\1b]uit, or [Next]: \1c");
        !          1212: strcpy(str,"VSQN\r");
        !          1213: if(user.misc&USER_PHOTO)
        !          1214:        strcat(str,"D");
        !          1215: if(SYSOP)
        !          1216:        strcat(str,"+");
        !          1217: switch(getkeys(str,0)) {
        !          1218:        case '+':
        !          1219:                user.misc|=USER_PHOTO;
        !          1220:                break;
        !          1221:        case 'Q':
        !          1222:                return(0);
        !          1223:        case CR:
        !          1224:        case 'N':
        !          1225:                return(1);
        !          1226:        case 'D':
        !          1227:                if(!useron.number) {
        !          1228:                        bputs("\r\n\1h\1rYou must create a profile first.\r\n");
        !          1229:                        pause();
        !          1230:                        break; }
        !          1231:                if(!(useron.misc&USER_PHOTO)) {
        !          1232:                        bputs("\r\n\1h\1rYou cannot download photos until your photo is "
        !          1233:                                "added.\r\n");
        !          1234:                        pause();
        !          1235:                        break; }
        !          1236:                for(i=0;user.system[i];i++)
        !          1237:                        if(isalnum(user.system[i]))
        !          1238:                                break;
        !          1239:                if(!user.system[i])
        !          1240:                        fname[0]='~';
        !          1241:                else
        !          1242:                        fname[0]=user.system[i];
        !          1243:                for(i=strlen(user.system)-1;i>0;i--)
        !          1244:                        if(isalnum(user.system[i]))
        !          1245:                                break;
        !          1246:                if(i<=0)
        !          1247:                        fname[1]='~';
        !          1248:                else
        !          1249:                        fname[1]=user.system[i];
        !          1250:                fname[2]=0;
        !          1251:                strupr(user.system);
        !          1252:                strcat(fname,base41(crc16(user.system),tmp));
        !          1253:                strcat(fname,base41(user.number,tmp));
        !          1254:                strcat(fname,".JPG");
        !          1255:                strupr(fname);
        !          1256:                sprintf(path,"PHOTO\\%s",fname);
        !          1257:                if(!fexist(path)) {
        !          1258:                        bputs("\r\n\1n\1hUnpacking...");
        !          1259:                        sprintf(str,"%spkunzip photo %s photo",exec_dir,fname);
        !          1260:                        system(str);
        !          1261:                        bputs("\r\n");
        !          1262:                        if(!fexist(path)) {
        !          1263:                                bputs("\r\n\1n\1h\1i\1rUnpacking failed!\1n\r\n");
        !          1264:                                pause();
        !          1265:                                break; } }
        !          1266:                if(com_port) {
        !          1267:                        cmdstr(zmodem_send,path,path,str);
        !          1268:                        ivhctl(INTCLR);
        !          1269:                        ivhctl(INT29L);
        !          1270:                        system(str);
        !          1271:                        ivhctl(INTCLR);
        !          1272:                        i=INT29L;
        !          1273:                        i|=(INT29R|INT16);
        !          1274:                        ivhctl(i); }
        !          1275:                else
        !          1276:                        system(cmdstr(local_view,path,path,str));
        !          1277:                pause();
        !          1278:                break;
        !          1279: 
        !          1280: 
        !          1281:        case 'S':
        !          1282:                send_telegram(user);
        !          1283:                break;
        !          1284:        case 'V':
        !          1285: 
        !          1286:                if(user_level<que_level) {
        !          1287:                        bputs("\r\n\1h\1rYou have insufficient access to read "
        !          1288:                                "questoinnaires.\r\n");
        !          1289:                        pause();
        !          1290:             break; }
        !          1291: 
        !          1292:                for(i=0;i<5;i++) {
        !          1293:                        aborted=0;
        !          1294:                        if(!user.queans[i].name[0])
        !          1295:                                continue;
        !          1296:                        s=sys_quenum(user.queans[i].name);
        !          1297:                        if(s==-1)
        !          1298:                                continue;
        !          1299:                        if(que[s]->req_age>getage(useron.birth))
        !          1300:                                continue;
        !          1301:                        if(match1 && match2)
        !          1302:                                u=user_quenum(user.queans[i].name,useron);
        !          1303:                        else
        !          1304:                                u=-1;
        !          1305:                        sprintf(str,"\r\nDo you wish to view the \1w%s\1b questionnaire"
        !          1306:                                ,que[s]->desc);
        !          1307:                        if(!yesno(str))
        !          1308:                                continue;
        !          1309:                        if(!cdt_warning(que_cdt))
        !          1310:                                continue;
        !          1311:                        adjust_cdt(que_cdt);
        !          1312:                        for(j=0;j<que[s]->total_ques && !aborted;) {
        !          1313:                                cls();
        !          1314:                                bprintf("\1n\1m\1hQuestionnaire: \1y%-25s \1mQuestion: "
        !          1315:                                        "\1y%d \1mof \1y%d  \1h\1b(Ctrl-C to Abort)\r\n\r\n"
        !          1316:                                        ,que[s]->desc,j+1,que[s]->total_ques);
        !          1317:                                bprintf("\1w\1h%s\r\n\r\n",que[s]->que[j].txt);
        !          1318:                                for(k=0;k<que[s]->que[j].answers;k++)
        !          1319:                                        bprintf("\1h\1b%c\1w) \1g%s\r\n",'A'+k
        !          1320:                                                ,que[s]->que[j].ans[k]);
        !          1321:                                bits2str(user.queans[i].self[j],str);
        !          1322:                                bprintf("\1n\1g\r\n%25s: \1h%-16s "
        !          1323:                                        ,user.name,str);
        !          1324:                                bits2str(user.queans[i].pref[j],str);
        !          1325:                                bprintf("\1n\1g %15s: \1h%s","Preferred mate",str);
        !          1326:                                if(u!=-1) {
        !          1327:                                        bits2str(useron.queans[u].pref[j],str);
        !          1328:                                        bprintf("\1n\1g\r\n%25s: \1h%-16s "
        !          1329:                                                ,"Your preferred mate",str);
        !          1330:                                        bits2str(useron.queans[u].self[j],str);
        !          1331:                                        bprintf("\1n\1g %15s: \1h%s","You",str); }
        !          1332:                                CRLF;
        !          1333:                                if(!aborted) {
        !          1334:                                        lncntr=0;
        !          1335:                                        bputs("\r\n\1h\1b[\1cP\1b]revious, [\1cQ\1b]uit, "
        !          1336:                                                "or [Next]: \1c");
        !          1337:                                        ch=getkeys("PQN\r",0);
        !          1338:                                        if(ch=='P') {
        !          1339:                                                if(j) j--;
        !          1340:                                                continue; }
        !          1341:                                        if(ch=='Q')
        !          1342:                                                break;
        !          1343:                                        j++; } } }
        !          1344:                break;
        !          1345: 
        !          1346:        } }
        !          1347: return(0);
        !          1348: }
        !          1349: 
        !          1350: 
        !          1351: /* Returns 0 if aborted, 1 if continue, negative if previous */
        !          1352: int short_user_info(user_t user)
        !          1353: {
        !          1354:        char str[128],height[64],ch;
        !          1355:     int i,match;
        !          1356:     int records;
        !          1357:     ulong  name_crc;
        !          1358:        static char name[26],lastname[26],highmatch;
        !          1359:     static long topixb,topdab,lastixb,lastdab;
        !          1360:     static int count;
        !          1361: 
        !          1362: if(!lncntr && smm_pause) {
        !          1363:        topdab=ftell(stream)-sizeof(user_t);
        !          1364:        topixb=ftell(index)-sizeof(ixb_t);
        !          1365:     if(!topdab)
        !          1366:         lastdab=lastixb=0;
        !          1367:     count=0;
        !          1368:        printfile("LIST_HDR.ASC");
        !          1369:        strcpy(lastname,name);
        !          1370:        name[0]=highmatch=0; }
        !          1371: if(user.number) {
        !          1372:        match=total_match(useron,user);
        !          1373:     if(!match) str[0]=0;
        !          1374:     else if(match>=90) sprintf(str,"\1w%u%%",match);
        !          1375:     else if(match>=80) sprintf(str,"\1c%u%%",match);
        !          1376:     else if(match>=70) sprintf(str,"\1y%u%%",match);
        !          1377:     else if(match>=60) sprintf(str,"\1g%u%%",match);
        !          1378:     else if(match>=50) sprintf(str,"\1m%u%%",match);
        !          1379:     else if(match>=40) sprintf(str,"\1r%u%%",match);
        !          1380:     else if(match>=30) sprintf(str,"\1b%u%%",match);
        !          1381:     else if(match>=20) sprintf(str,"\1n\1g%u%%",match);
        !          1382:     else if(match>=10) sprintf(str,"\1n\1c%u%%",match);
        !          1383:     else sprintf(str,"\1n%u%%",match);
        !          1384:        if(smm_misc&SMM_METRIC)
        !          1385:                sprintf(height," %-4u",intocm(user.height));
        !          1386:        else
        !          1387:                sprintf(height,"%2u'%-2u",user.height/12,user.height%12);
        !          1388:        bprintf("\1n\1h%c\1n\1g%c\1h\1c%c\1b%3u \1g%3s \1m%3s\1r%s \1y%-3u "
        !          1389:                "\1n\1g%-25.25s\1r\1h\1i%c\1n\1h%-25.25s%s\r\n"
        !          1390:         ,user.sex==user.pref_sex ? 'G':user.sex=='*' ? 'B'
        !          1391:             : marital_ch(user.marital)
        !          1392:         ,race_ch(user.race)
        !          1393:         ,user.sex
        !          1394:         ,getage(user.birth)
        !          1395:         ,hair(user.hair)
        !          1396:         ,eyes(user.eyes)
        !          1397:                ,height
        !          1398:                ,smm_misc&SMM_METRIC ? lptokg(user.weight) : user.weight
        !          1399:         ,user.location
        !          1400:                ,user.misc&USER_PHOTO ? '+':SP
        !          1401:         ,user.name
        !          1402:         ,str
        !          1403:         );
        !          1404:        if(match &&
        !          1405:                (!name[0] || !stricmp(name,lastname)
        !          1406:                || (stricmp(user.name,lastname) && match>highmatch))) {
        !          1407:                highmatch=match;
        !          1408:         sprintf(name,"%.25s",user.name);
        !          1409:         strupr(name); }
        !          1410:        }
        !          1411: 
        !          1412: if(lncntr>=user_rows-2 || !user.number) {
        !          1413:     lncntr=0;
        !          1414:        bputs(PrevReadSendQuitOrMore);
        !          1415:        ch=getkey(K_UPPER);
        !          1416:        if(ch=='Q') {
        !          1417:                cls();
        !          1418:                aborted=1; }
        !          1419:     else if(ch=='P') {
        !          1420:                cls();
        !          1421:         records=((ftell(stream)-topdab)/sizeof(user_t));
        !          1422:                fseek(stream,lastdab,SEEK_SET);
        !          1423:                fseek(index,lastixb,SEEK_SET);
        !          1424:                lastdab-=(records)*sizeof(user_t);
        !          1425:                lastixb-=(records)*sizeof(ixb_t);
        !          1426:         if(lastdab<0) lastdab=0;
        !          1427:         if(lastixb<0) lastixb=0;
        !          1428:         return(-count); }
        !          1429:        else if(ch=='R' || ch=='G' || ch=='S') {
        !          1430:         bprintf("\1n\r\1>\1y\1hUser name: ");
        !          1431:         if(getstr(name,25,K_NOCRLF|K_LINE|K_EDIT|K_AUTODEL|K_UPPER)) {
        !          1432:                        truncsp(name);
        !          1433:             name_crc=crc32(name);
        !          1434:             cls();
        !          1435:             rewind(index);
        !          1436:             while(!feof(index)) {
        !          1437:                 if(!fread(&ixb,sizeof(ixb_t),1,index))
        !          1438:                     break;
        !          1439:                 if(!ixb.number)    /* DELETED */
        !          1440:                     continue;
        !          1441:                 if(ixb.name!=name_crc)
        !          1442:                     continue;
        !          1443:                 fseek(stream
        !          1444:                     ,((ftell(index)-sizeof(ixb_t))/sizeof(ixb_t))
        !          1445:                     *sizeof(user_t),SEEK_SET);
        !          1446:                 if(!fread(&user,sizeof(user_t),1,stream))
        !          1447:                     continue;
        !          1448:                                if(ch=='S' && send_telegram(user))
        !          1449:                                        break;
        !          1450:                                if(ch!='S' && !long_user_info(user))
        !          1451:                     break; } }
        !          1452:         fseek(stream,topdab,SEEK_SET);
        !          1453:         fseek(index,topixb,SEEK_SET);
        !          1454:                cls();
        !          1455:                return(-1); }
        !          1456:     else {
        !          1457:         lastixb=topixb;
        !          1458:                lastdab=topdab;
        !          1459:                cls(); } }
        !          1460: 
        !          1461: count++;
        !          1462: if(aborted)
        !          1463:     return(0);
        !          1464: return(1);
        !          1465: }
        !          1466: 
        !          1467: 
        !          1468: int get_your_det(user_t *user)
        !          1469: {
        !          1470:        char    str[128],*p,*hdr;
        !          1471:        int     i;
        !          1472: 
        !          1473: while(1) {
        !          1474: checkline();
        !          1475: cls();
        !          1476: bputs("\1h\0014 Your Detailed Personal Information \1n  \1h\1b"
        !          1477:     "(Ctrl-C to Abort)\r\n\r\n");
        !          1478: 
        !          1479: nodesync();
        !          1480: bputs("\1h\1bPlease enter your name or alias: ");
        !          1481: strcpy(str,user->name);
        !          1482: if(!getstr(str,25,K_LINE|K_EDIT|K_AUTODEL|K_UPRLWR))
        !          1483:        return(0);
        !          1484: truncsp(str);
        !          1485: if(trash(str)) {
        !          1486:        bprintf("\r\n\1h\1rSorry, you can't use that name.\r\n\r\n\1p");
        !          1487:        continue; }
        !          1488: strcpy(user->name,str);
        !          1489: 
        !          1490: CRLF;
        !          1491: nodesync();
        !          1492: bprintf("\1h\1gPlease enter your height in %s: "
        !          1493:        ,smm_misc&SMM_METRIC ? "centimeters" : "feet'inches (example: 5'7)");
        !          1494: if(user->height) {
        !          1495:        if(smm_misc&SMM_METRIC)
        !          1496:                sprintf(str,"%u",intocm(user->height));
        !          1497:        else
        !          1498:                sprintf(str,"%u'%u",user->height/12,user->height%12); }
        !          1499: else
        !          1500:     str[0]=0;
        !          1501: if(!getstr(str,4,K_LINE|K_EDIT|K_AUTODEL))
        !          1502:        return(0);
        !          1503: if(smm_misc&SMM_METRIC)
        !          1504:        user->height=cmtoin(atoi(str));
        !          1505: else {
        !          1506:        user->height=atoi(str)*12;
        !          1507:        p=strchr(str,'\'');
        !          1508:        if(p) user->height+=atoi(p+1); }
        !          1509: 
        !          1510: CRLF;
        !          1511: nodesync();
        !          1512: bprintf("\1h\1mPlease enter your weight (in %s): "
        !          1513:        ,smm_misc&SMM_METRIC ? "kilograms":"pounds");
        !          1514: if(user->weight)
        !          1515:        sprintf(str,"%u"
        !          1516:                ,smm_misc&SMM_METRIC ? lptokg(user->weight) : user->weight);
        !          1517: else
        !          1518:     str[0]=0;
        !          1519: if(!getstr(str,3,K_NUMBER|K_EDIT|K_AUTODEL|K_LINE))
        !          1520:        return(0);
        !          1521: if(smm_misc&SMM_METRIC)
        !          1522:        user->weight=kgtolp(atoi(str));
        !          1523: else
        !          1524:        user->weight=atoi(str);
        !          1525: 
        !          1526: CRLF;
        !          1527: nodesync();
        !          1528: bputs("\1h\1rPlease enter your annual income in dollars (ENTER=undisclosed): ");
        !          1529: if(user->income && user->income!=0xffffffff)
        !          1530:        sprintf(str,"%luK",user->income/1000);
        !          1531: else
        !          1532:     str[0]=0;
        !          1533: getstr(str,6,K_UPPER|K_EDIT|K_AUTODEL|K_LINE);
        !          1534: if(aborted)
        !          1535:        return(0);
        !          1536: if(strchr(str,'K'))
        !          1537:        user->income=atol(str)*1000L;
        !          1538: else if(str[0]==0)
        !          1539:        user->income=0xffffffffUL;
        !          1540: else
        !          1541:        user->income=atol(str);
        !          1542: 
        !          1543: CRLF;
        !          1544: nodesync();
        !          1545: bputs("\1h\1cPlease enter your location (city, state): ");
        !          1546: strcpy(str,user->location);
        !          1547: if(!getstr(str,30,K_LINE|K_EDIT|K_AUTODEL|K_UPRLWR))
        !          1548:        return(0);
        !          1549: truncsp(str);
        !          1550: if(trash(str)) {
        !          1551:        bprintf("\r\n\1r\1hSorry, you can't use that location.\r\n\r\n\1p");
        !          1552:        continue; }
        !          1553: strcpy(user->location,str);
        !          1554: 
        !          1555: 
        !          1556: CRLF;
        !          1557: nodesync();
        !          1558: bputs("\1h\1gPlease enter your zip/postal code: ");
        !          1559: if(!getstr(user->zipcode,10,K_LINE|K_EDIT|K_AUTODEL))
        !          1560:        return(0);
        !          1561: 
        !          1562: CRLF;
        !          1563: nodesync();
        !          1564: for(i=0;i<5;i++) {
        !          1565:     bprintf("\1n\1gPersonal text - Line %u of 5: ",i+1);
        !          1566:     if(wordwrap[0])
        !          1567:         user->note[i][0]=0;
        !          1568:        strcpy(str,user->note[i]);
        !          1569:        if(!getstr(str,50,i==4 ? K_LINE|K_EDIT:K_LINE|K_EDIT|K_WRAP))
        !          1570:                break;
        !          1571:        if(trash(str)) {
        !          1572:                bprintf("\r\n\1r\1hSorry, you can't use that text.\r\n\r\n");
        !          1573:                i--;
        !          1574:                continue; }
        !          1575:        strcpy(user->note[i],str); }
        !          1576: while(i++<5)
        !          1577:     user->note[i][0]=0;
        !          1578: aborted=0;
        !          1579: nodesync();
        !          1580: if(yesno("\r\nIs the above information correct"))
        !          1581:     break; }
        !          1582: return(1);
        !          1583: }
        !          1584: 
        !          1585: int get_pref_det(user_t *user)
        !          1586: {
        !          1587:        char str[128],*p,*hdr;
        !          1588:        int i;
        !          1589: 
        !          1590: while(1) {
        !          1591: checkline();
        !          1592: cls();
        !          1593: bputs("\1h\0014 Detailed Information on Your Preferred Mate \1n  "
        !          1594:     "\1h\1b(Ctrl-C to Abort)\r\n\r\n");
        !          1595: 
        !          1596: nodesync();
        !          1597: bputs("\1n\1cPlease enter the minimum age of your preferred mate: \1h");
        !          1598: if(user->min_age)
        !          1599:     sprintf(str,"%u",user->min_age);
        !          1600: else
        !          1601:     str[0]=0;
        !          1602: getstr(str,3,K_NUMBER|K_EDIT|K_AUTODEL);
        !          1603: if(aborted)
        !          1604:        return(0);
        !          1605: user->min_age=atoi(str);
        !          1606: 
        !          1607: nodesync();
        !          1608: bputs("\1h\1cPlease enter the maximum age of your preferred mate: \1h");
        !          1609: if(user->max_age)
        !          1610:     sprintf(str,"%u",user->max_age);
        !          1611: else
        !          1612:     str[0]=0;
        !          1613: getstr(str,3,K_NUMBER|K_EDIT|K_AUTODEL);
        !          1614: if(aborted)
        !          1615:        return(0);
        !          1616: user->max_age=atoi(str);
        !          1617: if(user->min_age) {
        !          1618:        strcpy(str,"Do you require your mate's age fall within this range");
        !          1619:        if(user->misc&USER_REQAGE)
        !          1620:                i=yesno(str);
        !          1621:        else
        !          1622:                i=!noyes(str);
        !          1623:        if(i)
        !          1624:                user->misc|=USER_REQAGE;
        !          1625:        else
        !          1626:                user->misc&=~USER_REQAGE; }
        !          1627: else
        !          1628:        user->misc&=~USER_REQAGE;
        !          1629: if(aborted)
        !          1630:        return(0);
        !          1631: 
        !          1632: CRLF;
        !          1633: nodesync();
        !          1634: bprintf("\1n\1gPlease enter the minimum height of your preferred mate "
        !          1635:        "in %s: \1w\1h",smm_misc&SMM_METRIC ? "centimeters":"feet'inches");
        !          1636: if(user->min_height) {
        !          1637:        if(smm_misc&SMM_METRIC)
        !          1638:                sprintf(str,"%u",intocm(user->min_height));
        !          1639:        else
        !          1640:                sprintf(str,"%u'%u",user->min_height/12,user->min_height%12); }
        !          1641: else
        !          1642:     str[0]=0;
        !          1643: getstr(str,4,K_EDIT|K_AUTODEL);
        !          1644: if(aborted)
        !          1645:        return(0);
        !          1646: if(smm_misc&SMM_METRIC)
        !          1647:        user->min_height=cmtoin(atoi(str));
        !          1648: else {
        !          1649:        user->min_height=atoi(str)*12;
        !          1650:        p=strchr(str,'\'');
        !          1651:        if(p) user->min_height+=atoi(p+1); }
        !          1652: nodesync();
        !          1653: bprintf("\1h\1gPlease enter the maximum height of your preferred mate "
        !          1654:        "in %s: \1w",smm_misc&SMM_METRIC ? "centimeters":"feet'inches");
        !          1655: if(user->max_height) {
        !          1656:        if(smm_misc&SMM_METRIC)
        !          1657:                sprintf(str,"%u",intocm(user->max_height));
        !          1658:     else
        !          1659:                sprintf(str,"%u'%u",user->max_height/12,user->max_height%12); }
        !          1660: else
        !          1661:     str[0]=0;
        !          1662: getstr(str,4,K_EDIT|K_AUTODEL);
        !          1663: if(aborted)
        !          1664:        return(0);
        !          1665: if(smm_misc&SMM_METRIC)
        !          1666:        user->max_height=cmtoin(atoi(str));
        !          1667: else {
        !          1668:        user->max_height=atoi(str)*12;
        !          1669:        p=strchr(str,'\'');
        !          1670:        if(p) user->max_height+=atoi(p+1); }
        !          1671: strcpy(str,"Do you require your mate's height fall within this range");
        !          1672: if(user->misc&USER_REQHEIGHT)
        !          1673:        i=yesno(str);
        !          1674: else
        !          1675:        i=!noyes(str);
        !          1676: if(i)
        !          1677:     user->misc|=USER_REQHEIGHT;
        !          1678: else
        !          1679:     user->misc&=~USER_REQHEIGHT;
        !          1680: if(aborted)
        !          1681:     return(0);
        !          1682: 
        !          1683: 
        !          1684: CRLF;
        !          1685: nodesync();
        !          1686: bprintf("\1n\1mPlease enter the minimum weight of your preferred mate in %s:"
        !          1687:        " \1w\1h",smm_misc&SMM_METRIC ? "kilograms":"pounds");
        !          1688: if(user->min_weight) {
        !          1689:        if(smm_misc&SMM_METRIC)
        !          1690:                sprintf(str,"%u",lptokg(user->min_weight));
        !          1691:        else
        !          1692:                sprintf(str,"%u",user->min_weight); }
        !          1693: else
        !          1694:     str[0]=0;
        !          1695: getstr(str,3,K_NUMBER|K_EDIT|K_AUTODEL);
        !          1696: if(aborted)
        !          1697:        return(0);
        !          1698: if(smm_misc&SMM_METRIC)
        !          1699:        user->min_weight=kgtolp(atoi(str));
        !          1700: else
        !          1701:        user->min_weight=atoi(str);
        !          1702: 
        !          1703: nodesync();
        !          1704: bprintf("\1h\1mPlease enter the maximum weight of your preferred mate in %s:"
        !          1705:        " \1w",smm_misc&SMM_METRIC ? "kilograms":"pounds");
        !          1706: if(user->max_weight) {
        !          1707:        if(smm_misc&SMM_METRIC)
        !          1708:                sprintf(str,"%u",lptokg(user->max_weight));
        !          1709:        else
        !          1710:                sprintf(str,"%u",user->max_weight); }
        !          1711: else
        !          1712:     str[0]=0;
        !          1713: getstr(str,3,K_NUMBER|K_EDIT|K_AUTODEL);
        !          1714: if(aborted)
        !          1715:        return(0);
        !          1716: if(smm_misc&SMM_METRIC)
        !          1717:        user->max_weight=kgtolp(atoi(str));
        !          1718: else
        !          1719:        user->max_weight=atoi(str);
        !          1720: if(user->max_weight) {
        !          1721:        strcpy(str,"Do you require your mate's weight fall within this range");
        !          1722:        if(user->misc&USER_REQWEIGHT)
        !          1723:                i=yesno(str);
        !          1724:        else
        !          1725:                i=!noyes(str);
        !          1726:        if(i)
        !          1727:                user->misc|=USER_REQWEIGHT;
        !          1728:        else
        !          1729:                user->misc&=~USER_REQWEIGHT; }
        !          1730: else
        !          1731:        user->misc&=~USER_REQWEIGHT;
        !          1732: if(aborted)
        !          1733:     return(0);
        !          1734: 
        !          1735: 
        !          1736: CRLF;
        !          1737: nodesync();
        !          1738: bputs("\1h\1cPlease enter the lowest zip/postal code of your preferred "
        !          1739:     "mate: \1w");
        !          1740: getstr(user->min_zipcode,10,K_EDIT|K_AUTODEL|K_UPPER);
        !          1741: if(aborted)
        !          1742:        return(0);
        !          1743: bputs("\1h\1bPlease enter the highest zip/postal code of your preferred "
        !          1744:     "mate: \1w");
        !          1745: getstr(user->max_zipcode,10,K_EDIT|K_AUTODEL|K_UPPER);
        !          1746: if(aborted)
        !          1747:        return(0);
        !          1748: strcpy(str,"Do you require your mate's zip/postal code fall within this range");
        !          1749: if(user->misc&USER_REQZIP)
        !          1750:        i=yesno(str);
        !          1751: else
        !          1752:        i=!noyes(str);
        !          1753: if(i)
        !          1754:        user->misc|=USER_REQZIP;
        !          1755: else
        !          1756:        user->misc&=~USER_REQZIP;
        !          1757: if(aborted)
        !          1758:     return(0);
        !          1759: 
        !          1760: 
        !          1761: CRLF;
        !          1762: nodesync();
        !          1763: bputs("\1h\1gPlease enter the minimum annual income of your "
        !          1764:     "mate in dollars: \1w");
        !          1765: if(user->min_income)
        !          1766:     sprintf(str,"%lu",user->min_income);
        !          1767: else
        !          1768:     str[0]=0;
        !          1769: getstr(str,6,K_NUMBER|K_EDIT|K_AUTODEL);
        !          1770: if(aborted) return(0);
        !          1771: user->min_income=atol(str);
        !          1772: 
        !          1773: nodesync();
        !          1774: bputs("\1h\1yPlease enter the maximum annual income of your "
        !          1775:     "mate in dollars: \1w");
        !          1776: if(user->max_income)
        !          1777:     sprintf(str,"%lu",user->max_income);
        !          1778: else
        !          1779:     str[0]=0;
        !          1780: getstr(str,6,K_NUMBER|K_EDIT|K_AUTODEL);
        !          1781: if(aborted) return(0);
        !          1782: user->max_income=atol(str);
        !          1783: if(user->min_income) {
        !          1784:        strcpy(str,"Do you require that your mate's income fall within this range");
        !          1785:        if(user->misc&USER_REQINCOME)
        !          1786:                i=yesno(str);
        !          1787:        else
        !          1788:                i=!noyes(str);
        !          1789:        if(i)
        !          1790:                user->misc|=USER_REQINCOME;
        !          1791:        else
        !          1792:                user->misc&=~USER_REQINCOME; }
        !          1793: else
        !          1794:        user->misc&=~USER_REQINCOME;
        !          1795: if(aborted)
        !          1796:     return(0);
        !          1797: 
        !          1798: 
        !          1799: nodesync();
        !          1800: if(yesno("\r\nIs the above information correct"))
        !          1801:     break; }
        !          1802: return(1);
        !          1803: }
        !          1804: 
        !          1805: int get_your_multi(user_t *user)
        !          1806: {
        !          1807:        char str[128],*hdr,*p;
        !          1808: 
        !          1809: while(1) {
        !          1810: checkline();
        !          1811: hdr="\1n\1l\1h\0014 Your Profile \1n  \1h\1b(Ctrl-C to Abort)\r\n\r\n";
        !          1812: bputs(hdr);
        !          1813: bputs("\1n\1h\1cYour Marital Status:\r\n\r\n");
        !          1814: mnemonics("~A) Single\r\n~B) Married\r\n~C) Divorced\r\n~D) Widowed\r\n"
        !          1815:     "~E) Other\r\n");
        !          1816: nodesync();
        !          1817: bputs("\r\n\1y\1hWhich: \1w");
        !          1818: uchar2ans(user->marital,str);
        !          1819: if(!getstr(str,1,K_ALPHA|K_LINE|K_EDIT|K_AUTODEL|K_UPPER))
        !          1820:        return(0);
        !          1821: if(str[0]<='E')
        !          1822:        break; }
        !          1823: user->marital=ans2uchar(str);
        !          1824: 
        !          1825: while(1) {
        !          1826: checkline();
        !          1827: bputs(hdr);
        !          1828: bputs("\1n\1h\1cYour Race:\r\n\r\n");
        !          1829: mnemonics("~A) White\r\n~B) Black\r\n~C) Hispanic\r\n~D) Asian\r\n"
        !          1830:        "~E) American Indian\r\n~F) Middle Eastern\r\n~G) Other\r\n");
        !          1831: nodesync();
        !          1832: bputs("\r\n\1y\1hWhich: \1w");
        !          1833: uchar2ans(user->race,str);
        !          1834: if(!getstr(str,1,K_ALPHA|K_LINE|K_EDIT|K_AUTODEL|K_UPPER))
        !          1835:        return(0);
        !          1836: if(str[0]<='G')
        !          1837:     break; }
        !          1838: user->race=ans2uchar(str);
        !          1839: 
        !          1840: while(1) {
        !          1841: checkline();
        !          1842: bputs(hdr);
        !          1843: bputs("\1n\1h\1cYour Hair Color:\r\n\r\n");
        !          1844: mnemonics("~A) Blonde\r\n~B) Brown\r\n~C) Red\r\n~D) Black\r\n"
        !          1845:     "~E) Grey\r\n~F) Other\r\n");
        !          1846: nodesync();
        !          1847: bputs("\r\n\1y\1hWhich: \1w");
        !          1848: uchar2ans(user->hair,str);
        !          1849: if(!getstr(str,1,K_ALPHA|K_LINE|K_EDIT|K_AUTODEL|K_UPPER))
        !          1850:        return(0);
        !          1851: if(str[0]<='F')
        !          1852:     break; }
        !          1853: user->hair=ans2uchar(str);
        !          1854: 
        !          1855: while(1) {
        !          1856: checkline();
        !          1857: bputs(hdr);
        !          1858: bputs("\1n\1h\1cYour Eye Color:\r\n\r\n");
        !          1859: mnemonics("~A) Blue\r\n~B) Green\r\n~C) Hazel\r\n~D) Brown\r\n"
        !          1860:     "~E) Other\r\n");
        !          1861: nodesync();
        !          1862: bputs("\r\n\1y\1hWhich: \1w");
        !          1863: uchar2ans(user->eyes,str);
        !          1864: if(!getstr(str,1,K_ALPHA|K_LINE|K_EDIT|K_AUTODEL|K_UPPER))
        !          1865:        return(0);
        !          1866: if(str[0]<='E')
        !          1867:     break; }
        !          1868: user->eyes=ans2uchar(str);
        !          1869: return(1);
        !          1870: }
        !          1871: 
        !          1872: int get_pref_multi(user_t *user)
        !          1873: {
        !          1874:        char str[128],*hdr,*p;
        !          1875:        int i;
        !          1876: 
        !          1877: while(1) {
        !          1878: checkline();
        !          1879: hdr="\1n\1l\1h\0014 Profile of Your Preferred Mate \1n  \1h\1b"
        !          1880:     "(Ctrl-C to Abort)\r\n\r\n";
        !          1881: bputs(hdr);
        !          1882: bputs("\1n\1h\1cSex of Your Preferred (Intimate/Romantic) Mate:\r\n\r\n");
        !          1883: mnemonics("~M) Male\r\n~F) Female\r\n~*) Either\r\n");
        !          1884: nodesync();
        !          1885: bputs("\r\n\1y\1hWhich: ");
        !          1886: str[0]=user->pref_sex;
        !          1887: str[1]=0;
        !          1888: if(!getstr(str,1,K_UPPER|K_EDIT|K_AUTODEL|K_LINE))
        !          1889:     break;
        !          1890: if(user->sex==str[0] && noyes("\r\nYou are homosexual"))
        !          1891:        continue;
        !          1892: if(str[0]=='M' || str[0]=='F' || str[0]=='*')
        !          1893:     break; }
        !          1894: user->pref_sex=str[0];
        !          1895: if(aborted) return(0);
        !          1896: 
        !          1897: strcpy(str,"\r\nAre you seeking an any-sex (non-romantic) friendship");
        !          1898: if(user->misc&USER_FRIEND)
        !          1899:        i=yesno(str);
        !          1900: else
        !          1901:        i=!noyes(str);
        !          1902: if(i)
        !          1903:        user->misc|=USER_FRIEND;
        !          1904: else
        !          1905:        user->misc&=~USER_FRIEND;
        !          1906: 
        !          1907: bputs(hdr);
        !          1908: bputs("\1n\1h\1cMarital Status of Your Preferred Mate:\r\n\r\n");
        !          1909: mnemonics("~A) Single\r\n~B) Married\r\n~C) Divorced\r\n~D) Widowed\r\n"
        !          1910:     "~E) Other\r\n~*) Any of the above\r\n");
        !          1911: nodesync();
        !          1912: bputs("\r\n\1y\1hPlease enter up to 4 answers: ");
        !          1913: uchar2ans(user->pref_marital,str);
        !          1914: if(!getstr(str,4,K_UPPER|K_LINE|K_EDIT|K_AUTODEL))
        !          1915:        return(0);
        !          1916: user->pref_marital=ans2uchar(str);
        !          1917: if(user->pref_marital!=0xff) {
        !          1918:        strcpy(str,"\r\nDo you require your mate have the martial status you "
        !          1919:                "indicated");
        !          1920:        if(user->misc&USER_REQMARITAL)
        !          1921:                i=yesno(str);
        !          1922:        else
        !          1923:                i=!noyes(str);
        !          1924:        if(i)
        !          1925:         user->misc|=USER_REQMARITAL;
        !          1926:        else
        !          1927:                user->misc&=~USER_REQMARITAL; }
        !          1928: else
        !          1929:        user->misc&=~USER_REQMARITAL;
        !          1930: if(aborted) return(0);
        !          1931: 
        !          1932: bputs(hdr);
        !          1933: bputs("\1n\1h\1cRace of Your Preferred Mate:\r\n\r\n");
        !          1934: mnemonics("~A) White\r\n~B) Black\r\n~C) Hispanic\r\n~D) Asian\r\n"
        !          1935:     "~E) American Indian\r\n~F) Middle Eastern\r\n~G) Other\r\n"
        !          1936:     "~*) Any of the above\r\n");
        !          1937: nodesync();
        !          1938: bputs("\r\n\1y\1hPlease enter up to 6 answers: ");
        !          1939: uchar2ans(user->pref_race,str);
        !          1940: if(!getstr(str,6,K_UPPER|K_LINE|K_EDIT|K_AUTODEL))
        !          1941:        return(0);
        !          1942: user->pref_race=ans2uchar(str);
        !          1943: if(user->pref_race!=0xff) {
        !          1944:        strcpy(str,"\r\nDo you require your mate be of the race"
        !          1945:                " you indicated");
        !          1946:        if(user->misc&USER_REQRACE)
        !          1947:                i=yesno(str);
        !          1948:        else
        !          1949:                i=!noyes(str);
        !          1950:        if(i)
        !          1951:                user->misc|=USER_REQRACE;
        !          1952:        else
        !          1953:                user->misc&=~USER_REQRACE; }
        !          1954: else
        !          1955:        user->misc&=~USER_REQRACE;
        !          1956: if(aborted) return(0);
        !          1957: 
        !          1958: bputs(hdr);
        !          1959: bputs("\1n\1h\1cHair Color of Your Preferred Mate:\r\n\r\n");
        !          1960: mnemonics("~A) Blonde\r\n~B) Brown\r\n~C) Red\r\n~D) Black\r\n"
        !          1961:     "~E) Grey\r\n~F) Other\r\n~*) Any of the Above\r\n");
        !          1962: nodesync();
        !          1963: bputs("\r\n\1y\1hPlease enter up to 5 answers: ");
        !          1964: uchar2ans(user->pref_hair,str);
        !          1965: if(!getstr(str,5,K_UPPER|K_LINE|K_EDIT|K_AUTODEL))
        !          1966:        return(0);
        !          1967: user->pref_hair=ans2uchar(str);
        !          1968: if(user->pref_hair!=0xff) {
        !          1969:        strcpy(str,"\r\nDo you require your mate have the hair color"
        !          1970:                " you indicated");
        !          1971:        if(user->misc&USER_REQHAIR)
        !          1972:                i=yesno(str);
        !          1973:        else
        !          1974:                i=!noyes(str);
        !          1975:        if(i)
        !          1976:                user->misc|=USER_REQHAIR;
        !          1977:        else
        !          1978:                user->misc&=~USER_REQHAIR; }
        !          1979: else
        !          1980:        user->misc&=~USER_REQHAIR;
        !          1981: if(aborted) return(0);
        !          1982: 
        !          1983: 
        !          1984: bputs(hdr);
        !          1985: bputs("\1n\1h\1cEye Color of Your Preferred Mate:\r\n\r\n");
        !          1986: mnemonics("~A) Blue\r\n~B) Green\r\n~C) Hazel\r\n~D) Brown\r\n"
        !          1987:     "~E) Other\r\n~*) Any of the above\r\n");
        !          1988: nodesync();
        !          1989: bputs("\r\n\1y\1hPlease enter up to 4 answers: ");
        !          1990: uchar2ans(user->pref_eyes,str);
        !          1991: if(!getstr(str,4,K_UPPER|K_LINE|K_EDIT|K_AUTODEL))
        !          1992:        return(0);
        !          1993: user->pref_eyes=ans2uchar(str);
        !          1994: if(user->pref_eyes!=0xff) {
        !          1995:        strcpy(str,"\r\nDo you require your mate have the eye color"
        !          1996:                " you indicated");
        !          1997:        if(user->misc&USER_REQEYES)
        !          1998:                i=yesno(str);
        !          1999:        else
        !          2000:                i=!noyes(str);
        !          2001:        if(i)
        !          2002:                user->misc|=USER_REQEYES;
        !          2003:        else
        !          2004:                user->misc&=~USER_REQEYES; }
        !          2005: else
        !          2006:        user->misc&=~USER_REQEYES;
        !          2007: if(aborted) return(0);
        !          2008: 
        !          2009: bputs(hdr);
        !          2010: bputs("\1n\1h\1cZodiac Sign of Your Preferred Mate:\r\n\r\n");
        !          2011: mnemonics("~A) Aries\r\n~B) Taurus\r\n~C) Gemini\r\n~D) Cancer\r\n"
        !          2012:     "~E) Leo\r\n~F) Virgo\r\n~G) Libra\r\n~H) Scorpio\r\n");
        !          2013: mnemonics("~I) Sagittarius\r\n~J) Capricorn\r\n~K) Aquarius\r\n"
        !          2014:     "~L) Pisces\r\n~*) Any of the above\r\n");
        !          2015: nodesync();
        !          2016: bputs("\r\n\1y\1hPlease enter up to 11 answers: ");
        !          2017: bits2ans(user->pref_zodiac,str);
        !          2018: if(!getstr(str,11,K_UPPER|K_LINE|K_EDIT|K_AUTODEL))
        !          2019:        return(0);
        !          2020: user->pref_zodiac=ans2bits(str);
        !          2021: if(user->pref_zodiac!=0xffff) {
        !          2022:        strcpy(str,"\r\nDo you require your mate have the zodiac sign"
        !          2023:                " you indicated");
        !          2024:        if(user->misc&USER_REQZODIAC)
        !          2025:                i=yesno(str);
        !          2026:        else
        !          2027:                i=!noyes(str);
        !          2028:        if(i)
        !          2029:                user->misc|=USER_REQZODIAC;
        !          2030:        else
        !          2031:                user->misc&=~USER_REQZODIAC; }
        !          2032: else
        !          2033:        user->misc&=~USER_REQZODIAC;
        !          2034: if(aborted) return(0);
        !          2035: 
        !          2036: return(1);
        !          2037: }
        !          2038: 
        !          2039: void mbtype_desc(char *mbtype)
        !          2040: {
        !          2041:        char str[128],type[128];
        !          2042: 
        !          2043: while(1) {
        !          2044:        checkline();
        !          2045:        cls();
        !          2046:        printfile("MB-TYPE.ASC");
        !          2047:        nodesync();
        !          2048:        bprintf("\r\n\1y\1hYour Type: \1w%s\r\n",mbtype);
        !          2049:        bputs("\1y\1hLetter or Type to define: ");
        !          2050:        memset(type,0,5);
        !          2051:        if(!getstr(type,4,K_ALPHA|K_UPPER|K_LINE))
        !          2052:                break;
        !          2053:        sprintf(str,"MB-%s.ASC",type);
        !          2054:        if(!fexist(str)) {
        !          2055:                bputs("\r\nInvalid Letter or Type!\r\n\r\n");
        !          2056:                pause();
        !          2057:                continue; }
        !          2058:        cls();
        !          2059:        printfile(str);
        !          2060:        if(lncntr && !aborted)
        !          2061:                pause(); }
        !          2062: }
        !          2063: 
        !          2064: 
        !          2065: int get_mbtype(user_t *user)
        !          2066: {
        !          2067:        char str[256];
        !          2068:        int file,i=0,e=0,n=0,s=0,f=0,t=0,p=0,j=0,q=0,ch;
        !          2069:        FILE *stream;
        !          2070: 
        !          2071: aborted=0;
        !          2072: cls();
        !          2073: printfile("MB-INTRO.ASC");
        !          2074: if(aborted)
        !          2075:        return(0);
        !          2076: bputs("\1n\1hYour answers will be kept secret.\r\n\r\n"
        !          2077:        "Only your personality type will be visible to other users.\r\n\r\n");
        !          2078: nodesync();
        !          2079: if(!yesno("Continue with test"))
        !          2080:     return(0);
        !          2081: 
        !          2082: if((file=nopen("MB-TYPE.QUE",O_RDONLY))==-1 ||
        !          2083:        (stream=fdopen(file,"r"))==NULL) {
        !          2084:        bputs("\7\r\i\hCan't open MBTYPE.QUE\r\n\1p");
        !          2085:        return(0); }
        !          2086: while(!feof(stream)) {
        !          2087:        if(!fgets(str,200,stream))
        !          2088:         break;
        !          2089:        str[57]=0;
        !          2090:        truncsp(str);
        !          2091:        if(!str[0])
        !          2092:                break;
        !          2093:        cls();
        !          2094:        nodesync();
        !          2095:        bprintf("\1y\1hMyers-Briggs Personality Test  \1bQuestion #\1w%u  "
        !          2096:                "\1b(Ctrl-C to Abort)\r\n"
        !          2097:                "\r\n%s:\r\n\r\n"
        !          2098:                "[\1wA\1b] %.44s\r\n"
        !          2099:                "[\1wB\1b] %.44s\r\n"
        !          2100:                "[\1wC\1b] cannot decide\r\n\r\n"
        !          2101:                "Which: \1w"
        !          2102:                ,q+1,str,str+58,str+102);
        !          2103:        ch=getkeys("ABC",0);
        !          2104:        if(aborted) {
        !          2105:                fclose(stream);
        !          2106:                return(0); }
        !          2107:        if(ch=='C') {
        !          2108:                q++;
        !          2109:                continue; }
        !          2110: 
        !          2111:        if(ch=='A')
        !          2112:                ch=str[146];
        !          2113:        else
        !          2114:                ch=str[147];
        !          2115: 
        !          2116:        switch(ch) {
        !          2117:                case 'E':
        !          2118:                        e++;
        !          2119:                        break;
        !          2120:                case 'I':
        !          2121:                        i++;
        !          2122:                        break;
        !          2123:                case 'S':
        !          2124:                        s++;
        !          2125:                        break;
        !          2126:                case 'N':
        !          2127:                        n++;
        !          2128:                        break;
        !          2129:                case 'T':
        !          2130:                        t++;
        !          2131:                        break;
        !          2132:                case 'F':
        !          2133:                        f++;
        !          2134:                        break;
        !          2135:                case 'J':
        !          2136:                        j++;
        !          2137:                        break;
        !          2138:                case 'P':
        !          2139:                        p++;
        !          2140:                        break; }
        !          2141:        q++; }
        !          2142: 
        !          2143: fclose(stream);
        !          2144: 
        !          2145: if(i>e)
        !          2146:        user->mbtype[0]='I';
        !          2147: else if(i==e)
        !          2148:        user->mbtype[0]='*';
        !          2149: else
        !          2150:        user->mbtype[0]='E';
        !          2151: 
        !          2152: if(s>n)
        !          2153:        user->mbtype[1]='S';
        !          2154: else if(s==n)
        !          2155:        user->mbtype[1]='*';
        !          2156: else
        !          2157:        user->mbtype[1]='N';
        !          2158: 
        !          2159: if(t>f)
        !          2160:        user->mbtype[2]='T';
        !          2161: else if(t==f)
        !          2162:        user->mbtype[2]='*';
        !          2163: else
        !          2164:        user->mbtype[2]='F';
        !          2165: 
        !          2166: if(p>j)
        !          2167:        user->mbtype[3]='P';
        !          2168: else if(p==j)
        !          2169:        user->mbtype[3]='*';
        !          2170: else
        !          2171:        user->mbtype[3]='J';
        !          2172: 
        !          2173: bprintf("\1l\1y\1hYour Myers-Briggs Personality Type is \1w%s\r\n\r\n"
        !          2174:        ,user->mbtype);
        !          2175: 
        !          2176: if(yesno("Would you like to see the personality type descriptions"))
        !          2177:        mbtype_desc(user->mbtype);
        !          2178: return(1);
        !          2179: }
        !          2180: 
        !          2181: 
        !          2182: int get_purity(user_t *user)
        !          2183: {
        !          2184:        char str[128];
        !          2185:        int file,no_ans=0,pos_ans=0;
        !          2186:        FILE *stream;
        !          2187: 
        !          2188: aborted=0;
        !          2189: if(!fexist("PURITY.QUE") || purity_age>getage(user->birth))
        !          2190:        return(0);
        !          2191: cls();
        !          2192: printfile("PURITY.ASC");
        !          2193: if(aborted)
        !          2194:        return(0);
        !          2195: bputs("\1n\1hYour answers will be kept secret.\r\n\r\n"
        !          2196:        "Only your purity score will be visible to other users.\r\n\r\n");
        !          2197: nodesync();
        !          2198: if(!yesno("Continue with test"))
        !          2199:        return(0);
        !          2200: if((file=nopen("PURITY.QUE",O_RDONLY))==-1 ||
        !          2201:        (stream=fdopen(file,"r"))==NULL) {
        !          2202:        bputs("\7\r\i\hCan't open PURITY.QUE\r\n\1p");
        !          2203:        return(0); }
        !          2204: while(!feof(stream)) {
        !          2205:        if(!fgets(str,81,stream))
        !          2206:                break;
        !          2207:        truncsp(str);
        !          2208:        cls();
        !          2209:        if(str[0]=='*') {
        !          2210:                printfile(str+1);
        !          2211:                if(lncntr && !aborted)
        !          2212:                        pause();
        !          2213:                if(aborted)
        !          2214:                        break;
        !          2215:                continue; }
        !          2216:        nodesync();
        !          2217:        bprintf("\1y\1hPurity Test  \1bQuestion #\1w%u  \1b(Ctrl-C to Abort)\r\n"
        !          2218:                "\r\nHave you ever:\r\n\r\n"
        !          2219:                ,++pos_ans);
        !          2220:        if(noyes(str))
        !          2221:                no_ans++;
        !          2222:        if(aborted)
        !          2223:                break; }
        !          2224: 
        !          2225: fclose(stream);
        !          2226: if(aborted)
        !          2227:        return(0);
        !          2228: 
        !          2229: user->purity=((float)no_ans/pos_ans)*100.0;
        !          2230: bprintf("\1l\1y\1hCongratulations, you are \1w%u%%\1y pure!\r\n\r\n"
        !          2231:        ,user->purity);
        !          2232: pause();
        !          2233: return(1);
        !          2234: }
        !          2235: 
        !          2236: int get_que(int i, user_t *inuser)
        !          2237: {
        !          2238:        char str[128];
        !          2239:        int j,k,x,y,u;
        !          2240:        user_t user=*inuser;
        !          2241: 
        !          2242: if(que[i]->req_age>getage(inuser->birth))
        !          2243:        return(0);
        !          2244: for(j=0;j<que[i]->total_ques && !aborted;j++) {
        !          2245: 
        !          2246:        u=user_quenum(que[i]->name,user);
        !          2247:        if(u==-1) {                     /* not already answered */
        !          2248:                for(u=0;u<5;u++)        /* search for unused questionnaire slot */
        !          2249:                        if(sys_quenum(user.queans[u].name)==-1)
        !          2250:                                break;
        !          2251:                if(u==5) {              /* All questionnaire slots used!?? */
        !          2252:                        bputs("\r\n\7Questionnaire error, inform sysop!\r\n");
        !          2253:                        pause();
        !          2254:                        return(0); } }
        !          2255:        strcpy(user.queans[u].name,que[i]->name);
        !          2256:        cls();
        !          2257:        bprintf("\1n\1m\1hQuestionnaire: \1y%-25s \1mQuestion: "
        !          2258:                "\1y%d \1mof \1y%d  \1h\1b(Ctrl-C to Abort)\r\n\r\n"
        !          2259:                ,que[i]->desc,j+1,que[i]->total_ques);
        !          2260:        bprintf("\1w\1h%s\r\n\r\n",que[i]->que[j].txt);
        !          2261:        for(k=0;k<que[i]->que[j].answers;k++)
        !          2262:                bprintf("\1h\1b%c\1w) \1g%s\r\n",'A'+k,que[i]->que[j].ans[k]);
        !          2263:        nodesync();
        !          2264:        bprintf("\1n\1g\r\nChoose %s%d answer%s to describe "
        !          2265:                "\1hyourself\1n\1g%s: "
        !          2266:                ,que[i]->que[j].allowed > 1 ? "up to ":""
        !          2267:                ,que[i]->que[j].allowed,que[i]->que[j].allowed > 1 ? "s":""
        !          2268:                ,j ? " or \1h-\1n\1g to go back" : "");
        !          2269:        bits2ans(user.queans[u].self[j],str);
        !          2270:        getstr(str,que[i]->que[j].allowed,K_UPPER|K_LINE|K_EDIT|K_AUTODEL);
        !          2271:        if(aborted)
        !          2272:                return(0);
        !          2273:        truncsp(str);
        !          2274:        if(!str[0]) {
        !          2275:                j--;
        !          2276:                continue; }
        !          2277:        if(str[0]=='-') {
        !          2278:                if(j) j-=2;
        !          2279:                else j--;
        !          2280:                continue; }
        !          2281:        y=strlen(str);
        !          2282:        for(x=0;x<y;x++)
        !          2283:                if(!isalpha(str[x]) || str[x]-'A'>que[i]->que[j].answers-1)
        !          2284:                        break;
        !          2285:        if(x<y) {
        !          2286:                j--;
        !          2287:                continue; }
        !          2288:        user.queans[u].self[j]=ans2bits(str);
        !          2289:        nodesync();
        !          2290:        bprintf("\1n\1g\r\n%s%d answer%s to describe your \1hpreferred mate"
        !          2291:                "\1n\1g or \1h*\1n\1g for any: "
        !          2292:                ,que[i]->que[j].answers > 1 ? "Up to ":""
        !          2293:                ,que[i]->que[j].answers,que[i]->que[j].answers > 1 ? "s":"");
        !          2294:        if(user.queans[u].pref[j])
        !          2295:                bits2ans(user.queans[u].pref[j],str);
        !          2296:        getstr(str,que[i]->que[j].answers,K_UPPER|K_LINE|K_EDIT|K_AUTODEL);
        !          2297:        if(aborted)
        !          2298:                return(0);
        !          2299:        truncsp(str);
        !          2300:        if(!str[0]) {
        !          2301:                j--;
        !          2302:                continue; }
        !          2303:        y=strlen(str);
        !          2304:        for(x=0;x<y;x++)
        !          2305:                if(isalpha(str[x]) && str[x]-'A'>que[i]->que[j].answers-1)
        !          2306:                        break;
        !          2307:        if(x<y) {
        !          2308:                j--;
        !          2309:                continue; }
        !          2310:        user.queans[u].pref[j]=ans2bits(str); }
        !          2311: *inuser=user;
        !          2312: return(1);
        !          2313: }
        !          2314: 
        !          2315: /* Gets/updates profile from user. Returns 0 if aborted. */
        !          2316: 
        !          2317: char get_user_info(user_t *user)
        !          2318: {
        !          2319:        char str[128],*p,*hdr;
        !          2320:        int i,j,k,x,y;
        !          2321: 
        !          2322: while(1) {
        !          2323:        checkline();
        !          2324:        timeleft=0xffff;
        !          2325:        aborted=0;
        !          2326:        main_user_info(*user);
        !          2327:        CRLF;
        !          2328:        bputs("\1n\1h");
        !          2329:        bputs("\1b[\1wA\1b] Your name, height, weight, income, location, and "
        !          2330:                        "text\r\n"
        !          2331:                  "\1b[\1wB\1b] Your marital status, race, hair color, and eye "
        !          2332:                        "color\r\n"
        !          2333:                  "\1b[\1wC\1b] Preferred age, height, weight, location, and income\r\n"
        !          2334:                  "\1b[\1wD\1b] Preferred sex, marital status, race, hair color, eye "
        !          2335:                        "color, and zodiac\r\n"
        !          2336:                  );
        !          2337:        for(i=0;i<total_ques;i++) {
        !          2338:                if(que[i]->req_age>getage(user->birth))
        !          2339:                        continue;
        !          2340:                bprintf("\1b[\1w%u\1b] \1w%s \1bquestionnaire\1b (%u questions) \1w%s\r\n"
        !          2341:                        ,i+1,que[i]->desc,que[i]->total_ques
        !          2342:                        ,user_quenum(que[i]->name,*user)==-1 ? "[Unanswered]":"[Answered]");
        !          2343:                        }
        !          2344:        bprintf("\1b[\1wM\1b] Myers-Briggs personality test (70 questions) "
        !          2345:                "\1w[%s]\r\n",user->mbtype[0] ? user->mbtype : "Unanswered");
        !          2346:        if(fexist("PURITY.QUE") && purity_age<=getage(user->birth))
        !          2347:                bprintf("\1b[\1wP\1b] Purity test \1w(%u%% pure)\r\n"
        !          2348:                        ,user->purity);
        !          2349:        bputs("\r\n\1bWhich or [\1wQ\1b]uit: \1w");
        !          2350:        i=getkeys("ABCDMPQ",total_ques);
        !          2351:        if(i&0x8000) {
        !          2352:                i&=~0x8000;
        !          2353:                i--;
        !          2354:                get_que(i,user);
        !          2355:                continue; }
        !          2356: 
        !          2357:        switch(i) {
        !          2358:                case 'A':
        !          2359:                        get_your_det(user);
        !          2360:                        break;
        !          2361:                case 'C':
        !          2362:                        get_pref_det(user);
        !          2363:                        break;
        !          2364:                case 'B':
        !          2365:                        get_your_multi(user);
        !          2366:                        break;
        !          2367:                case 'D':
        !          2368:                        get_pref_multi(user);
        !          2369:                        break;
        !          2370:                case 'M':
        !          2371:                        get_mbtype(user);
        !          2372:                        break;
        !          2373:                case 'P':
        !          2374:                        get_purity(user);
        !          2375:                        break;
        !          2376:                case 'Q':
        !          2377:                        return(1); } }
        !          2378: }
        !          2379: 
        !          2380: void write_user()
        !          2381: {
        !          2382:     char str[256];
        !          2383: 
        !          2384: if(auto_update && time(NULL)-useron.updated>(long)auto_update*24L*60L*60L)
        !          2385:        useron.updated=time(NULL);
        !          2386: fseek(stream,useron_record*sizeof(user_t),SEEK_SET);
        !          2387: fwrite(&useron,sizeof(user_t),1,stream);
        !          2388: fflush(stream);
        !          2389: 
        !          2390: ixb.updated=useron.updated;
        !          2391: if(useron.misc&USER_DELETED)
        !          2392:     ixb.number=0;
        !          2393: else
        !          2394:     ixb.number=useron.number;
        !          2395: strcpy(str,useron.name);
        !          2396: strupr(str);
        !          2397: ixb.name=crc32(str);
        !          2398: ixb.system=system_crc;
        !          2399: fseek(index,useron_record*sizeof(ixb_t),SEEK_SET);
        !          2400: fwrite(&ixb,sizeof(ixb_t),1,index);
        !          2401: fflush(index);
        !          2402: if(!ixb.number) {
        !          2403:        sprintf(str,"%04u.MSG",useron.number);
        !          2404:        remove(str); }
        !          2405: }
        !          2406: 
        !          2407: 
        !          2408: void add_userinfo()
        !          2409: {
        !          2410:        static user_t user;
        !          2411:        char str[128];
        !          2412:        ushort tleft=timeleft;
        !          2413:        int i;
        !          2414: 
        !          2415: if(!cdt_warning(profile_cdt))
        !          2416:        return;
        !          2417: timeleft=0xffff;
        !          2418: user.number=user_number;
        !          2419: user.sex=user_sex;
        !          2420: strcpy(user.name,user_name);
        !          2421: strcpy(user.realname,user_name);
        !          2422: strcpy(user.system,system_name);
        !          2423: strcpy(user.birth,user_birth);
        !          2424: strcpy(user.zipcode,user_zipcode);
        !          2425: sprintf(user.min_zipcode,"%c0000",user_zipcode[0]);
        !          2426: sprintf(user.max_zipcode,"%c9999",user_zipcode[0]);
        !          2427: strcpy(user.location,user_location);
        !          2428: if(user.sex!='M' && user.sex!='F') {
        !          2429:        if(yesno("Are you of male gender"))
        !          2430:                user.sex='M';
        !          2431:        else
        !          2432:                user.sex='F'; }
        !          2433: if(!getage(user.birth))
        !          2434:        while(1) {
        !          2435:                checkline();
        !          2436:                cls();
        !          2437:                bputs("\1l\1y\1hYour birthdate (MM/DD/YY): ");
        !          2438:                if(!getstr(user.birth,8,K_UPPER|K_LINE))
        !          2439:                        return;
        !          2440:                if(getage(user.birth))
        !          2441:                        break; }
        !          2442: 
        !          2443: user.pref_sex=user.sex=='M' ? 'F' : 'M';
        !          2444: user.created=time(NULL);
        !          2445: if(!get_your_det(&user) || !get_your_multi(&user) || !get_pref_multi(&user)
        !          2446:        || !get_pref_det(&user)) {
        !          2447:        timeleft=tleft;
        !          2448:        return; }
        !          2449: for(i=0;i<total_ques;i++) {
        !          2450:        aborted=0;
        !          2451:        if(que[i]->req_age>getage(user.birth))
        !          2452:                continue;
        !          2453:        timeleft=0xffff;
        !          2454:        cls();
        !          2455:        bprintf("\1w\1h%s Questionnaire: \1y%u questions\r\n\r\n"
        !          2456:                "\1cAnswers will be viewable by other users.\r\n\r\n"
        !          2457:                ,que[i]->desc,que[i]->total_ques);
        !          2458:        if(yesno("Continue with questionnaire"))
        !          2459:                get_que(i,&user); }
        !          2460: timeleft=0xffff;
        !          2461: get_mbtype(&user);
        !          2462: timeleft=0xffff;
        !          2463: get_purity(&user);
        !          2464: if(!get_user_info(&user)) {
        !          2465:        timeleft=tleft;
        !          2466:        return; }
        !          2467: user.updated=time(NULL);
        !          2468: useron=user;
        !          2469: bputs("\1n\1h\r\nSaving...");
        !          2470: rewind(index);
        !          2471: while(!feof(index)) {
        !          2472:        if(!fread(&ixb,sizeof(ixb_t),1,index))
        !          2473:                break;
        !          2474:        if(!ixb.number) {         /* Deleted User */
        !          2475:                fseek(index,ftell(index)-sizeof(ixb_t),SEEK_SET);
        !          2476:                break; } }
        !          2477: 
        !          2478: useron_record=ftell(index)/sizeof(ixb_t);
        !          2479: 
        !          2480: write_user();
        !          2481: adjust_cdt(profile_cdt);
        !          2482: 
        !          2483: if(notify_user && notify_user!=user_number) {
        !          2484:        sprintf(str,"\1n\1hSMM: \1y%s \1madded %s profile to the Match Maker.\r\n"
        !          2485:                ,user_name,user_sex=='M' ? "his":"her");
        !          2486:        if(node_dir[0])
        !          2487:                putsmsg(notify_user,str);
        !          2488:        else
        !          2489:                puttgram(notify_user,str); }
        !          2490: 
        !          2491: timeleft=tleft;
        !          2492: }
        !          2493: 
        !          2494: void delphoto(user_t user)
        !          2495: {
        !          2496:        char fname[64],path[128];
        !          2497:        int i;
        !          2498:        struct ffblk ff;
        !          2499: 
        !          2500: if(!(user.misc&USER_PHOTO))
        !          2501:        return;
        !          2502: for(i=0;user.system[i];i++)
        !          2503:        if(isalnum(user.system[i]))
        !          2504:         break;
        !          2505: if(!user.system[i])
        !          2506:        fname[0]='~';
        !          2507: else
        !          2508:        fname[0]=user.system[i];
        !          2509: for(i=strlen(user.system)-1;i>0;i--)
        !          2510:        if(isalnum(user.system[i]))
        !          2511:                break;
        !          2512: if(i<=0)
        !          2513:        fname[1]='~';
        !          2514: else
        !          2515:        fname[1]=user.system[i];
        !          2516: fname[2]=0;
        !          2517: strupr(user.system);
        !          2518: strcat(fname,base41(crc16(user.system),tmp));
        !          2519: strcat(fname,base41(user.number,tmp));
        !          2520: strcat(fname,".*");
        !          2521: strupr(fname);
        !          2522: sprintf(path,"PHOTO\\%s",fname);
        !          2523: i=findfirst(path,&ff,0);
        !          2524: if(i)
        !          2525:        return;
        !          2526: sprintf(path,"PHOTO\\%s",ff.ff_name);
        !          2527: if(remove(path))
        !          2528:        bprintf("\1r\1h\7%s couldn't be removed!\1n\r\n",path);
        !          2529: else
        !          2530:        bprintf("\1r\1hPhoto removed.\r\n");
        !          2531: }
        !          2532: 
        !          2533: 
        !          2534: void smm_exit()
        !          2535: {
        !          2536:        char str[128];
        !          2537:        int i;
        !          2538:        FILE *in,*out;
        !          2539: 
        !          2540: if(io_int) {
        !          2541:        io_int=0;
        !          2542:        ivhctl(0); }
        !          2543: if(com_port) {
        !          2544:        for(i=0;i<5;i++)
        !          2545:                if(!rioctl(TXBC))               /* wait for rest of output */
        !          2546:                        break;
        !          2547:                else
        !          2548:                        mswait(1000);
        !          2549:     rioini(0,0); }
        !          2550: if(useron.number) {
        !          2551:        useron.lastin=time(NULL);
        !          2552:        write_user(); }
        !          2553: if(stream)
        !          2554:        fclose(stream);
        !          2555: if(cdt_adjustment) {
        !          2556:        if(node_dir[0]) {
        !          2557:                sprintf(str,"%sMODUSER.DAT",node_dir);
        !          2558:                if((out=fopen(str,"wt"))==NULL) {
        !          2559:                        bprintf("Error opening %s for write\r\n",str);
        !          2560:                        return; }
        !          2561:                fprintf(out,"%ld",cdt_adjustment);
        !          2562:                fclose(out); }
        !          2563:        else {                                                  /* Write back credits to DOOR.SYS */
        !          2564:                strcpy(str,door_sys);
        !          2565:                str[strlen(str)-1]='_';
        !          2566:                remove(str);
        !          2567:                rename(door_sys,str);
        !          2568:                if((in=fopen(str,"rb"))==NULL) {
        !          2569:                        bprintf("Error opening %s for read\r\n",str);
        !          2570:             return; }
        !          2571:                if((out=fopen(door_sys,"wb"))==NULL) {
        !          2572:                        bprintf("Error opening %s for write\r\n",door_sys);
        !          2573:                        return; }
        !          2574:                for(i=0;!feof(in);i++) {
        !          2575:                        if(!fgets(tmp,128,in))
        !          2576:                                break;
        !          2577:                        if(i+1==30)
        !          2578:                                fprintf(out,"%ld\r\n",-(cdt_adjustment/1024L));
        !          2579:                        else if(i+1==31)
        !          2580:                                fprintf(out,"%ld\r\n",(user_cdt+cdt_adjustment)/1024L);
        !          2581:                        else
        !          2582:                                fprintf(out,"%s",tmp); }
        !          2583:                fclose(in);
        !          2584:                fclose(out);
        !          2585:                remove(str);
        !          2586:                } }
        !          2587: }
        !          2588: 
        !          2589: time_t checktime()
        !          2590: {
        !          2591:        struct tm tm;
        !          2592: 
        !          2593: memset(&tm,0,sizeof(tm));
        !          2594: tm.tm_year=94;
        !          2595: tm.tm_mday=1;
        !          2596: return(mktime(&tm)^0x2D24BD00L);
        !          2597: }
        !          2598: 
        !          2599: void statusline(void)
        !          2600: {
        !          2601:        int col,row;
        !          2602: 
        !          2603: col=lclwx();
        !          2604: row=lclwy();
        !          2605: lclxy(1,node_scrnlen);
        !          2606: lclatr(CYAN|HIGH|(BLUE<<4));
        !          2607: lputs("  ");
        !          2608: lprintf("%-25.25s %02d %-25.25s  %02d %c %s"
        !          2609:     ,user_name,user_level,user_realname[0] ? user_realname : user_location
        !          2610:     ,getage(user_birth)
        !          2611:     ,user_sex ? user_sex : SP
        !          2612:     ,user_phone);
        !          2613: lputc(CLREOL);
        !          2614: lclatr(LIGHTGRAY);
        !          2615: lclxy(col,row);
        !          2616: }
        !          2617: 
        !          2618: 
        !          2619: int minor_protection(user_t user)
        !          2620: {
        !          2621: if(!user_number || !age_split || SYSOP)
        !          2622:        return(0);
        !          2623: if(getage(user_birth)<age_split && getage(user.birth)>=age_split)
        !          2624:        return(1);
        !          2625: if(getage(user_birth)>=age_split && getage(user.birth)<age_split)
        !          2626:        return(1);
        !          2627: return(0);
        !          2628: }
        !          2629: 
        !          2630: void main(int argc, char **argv)
        !          2631: {
        !          2632:        char    str[512],name[128],desc[128],gotoname[128],*p,ext,ch;
        !          2633:        int     i,j,k,file,match,found;
        !          2634:        uint    base=0xffff;
        !          2635:        ushort  tleft;
        !          2636:        long    l,offset;
        !          2637:        ulong   name_crc,sys_crc,*crc_lst,ul;
        !          2638:        FILE    *fp,*que_lst;
        !          2639:        user_t  user;
        !          2640:        wall_t  wall;
        !          2641:        struct  ffblk ff;
        !          2642: 
        !          2643: nodefile=-1;
        !          2644: node_misc=NM_LOWPRIO;
        !          2645: com_port=-1;
        !          2646: com_base=0;
        !          2647: com_irq=com_rate=0;
        !          2648: node_dir[0]=exec_dir[0]=temp_dir[0]=ctrl_dir[0]=door_sys[0]=system_name[0]=0;
        !          2649: sys_name[0]=0;
        !          2650: 
        !          2651: p=getenv("SBBSNODE");
        !          2652: if(p) {
        !          2653:        strcpy(node_dir,p);
        !          2654:        if(node_dir[strlen(node_dir)-1]!='\\')
        !          2655:                strcat(node_dir,"\\");
        !          2656:        initdata(); }
        !          2657: 
        !          2658: gotoname[0]=0;
        !          2659: for(i=1;i<argc;i++) {
        !          2660:        if(argv[i][0]=='/') {
        !          2661:                switch(toupper(argv[i][1])) {
        !          2662:                        case 'P':
        !          2663:                                com_port=atoi(argv[i]+2);
        !          2664:                                break;
        !          2665:                        case 'I':
        !          2666:                                com_irq=atoi(argv[i]+2);
        !          2667:                                break;
        !          2668:                        case 'C':
        !          2669:                                com_base=ahtoul(argv[i]+2);
        !          2670:                                break;
        !          2671:                        case 'R':
        !          2672:                                com_rate=atol(argv[i]+2);
        !          2673:                                break;
        !          2674:                        case 'T':
        !          2675:                                mswtyp=atoi(argv[i]+2);
        !          2676:                                break;
        !          2677:                        case 'N':
        !          2678:                                node_dir[0]=0;
        !          2679:                                break;
        !          2680:                        default:
        !          2681:                                printf("\nusage: SMM [DOOR.SYS] [/option] [/option] [...] [user name]\n");
        !          2682:                                printf("\n");
        !          2683:                                printf("where:\n");
        !          2684:                                printf("       DOOR.SYS is the path and filename of DOOR.SYS\n");
        !          2685:                                printf("\n");
        !          2686:                                printf("       /p# sets com port\n");
        !          2687:                                printf("       /i# sets com irq\n");
        !          2688:                                printf("       /c# sets com I/O address (or DIGI or FOSSIL)\n");
        !          2689:                                printf("       /r# sets com rate\n");
        !          2690:                                printf("       /t# sets time-slice API support\n");
        !          2691:                                printf("\n");
        !          2692:                                printf("       user name (if specified) is user to look-up\n");
        !          2693:                                exit(1); }
        !          2694:                continue; }
        !          2695:        if(!node_dir[0] && !door_sys[0]) {
        !          2696:                strcpy(door_sys,argv[i]);
        !          2697:                continue; }
        !          2698:        if(gotoname[0])
        !          2699:                strcat(gotoname," ");
        !          2700:        strcat(gotoname,argv[i]); }
        !          2701: 
        !          2702: if(!node_dir[0] && !door_sys[0]) {
        !          2703:        printf("\n\7SBBSNODE environment variable not set and DOOR.SYS not "
        !          2704:                "specified.\n");
        !          2705:        exit(1); }
        !          2706: 
        !          2707: if(door_sys[0]) {
        !          2708:        #ifdef __TURBOC__
        !          2709:                ctrlbrk(cbreakh);
        !          2710:        #endif
        !          2711: 
        !          2712:        #ifdef __WATCOMC__
        !          2713:                putenv("TZ=UCT0");
        !          2714:                setvbuf(stdout,NULL,_IONBF,0);
        !          2715:                setvbuf(stderr,NULL,_IONBF,0);
        !          2716:        #endif
        !          2717: 
        !          2718:        if(setmode(fileno(stderr),O_BINARY)==-1) {       /* eliminate LF expansion */
        !          2719:                printf("\n\7Can't set stderr to BINARY\n");
        !          2720:                exit(1); }
        !          2721: 
        !          2722:        starttime=time(NULL);                   /* initialize start time stamp */
        !          2723:        wordwrap[0]=0;                                  /* set wordwrap to null */
        !          2724:        attr(LIGHTGRAY);                                /* initialize color and curatr to plain */
        !          2725:        mnehigh=LIGHTGRAY|HIGH;                 /* mnemonics highlight color */
        !          2726:        mnelow=GREEN;                                   /* mnemonics normal text color */
        !          2727:        sec_warn=180;                                   /* seconds till inactivity warning */
        !          2728:        sec_timeout=300;                                /* seconds till inactivity timeout */
        !          2729:        tos=lncntr=0;                                   /* init topofscreen and linecounter to 0 */
        !          2730:        lastnodemsg=0;                                  /* Last node to send message to */
        !          2731:        aborted=0;                                              /* Ctrl-C hit flag */
        !          2732: 
        !          2733:        fp=fopen(door_sys,"rb");
        !          2734:        if(!fp) {
        !          2735:                printf("\n\7ERROR opening %s\n",door_sys);
        !          2736:                exit(2); }
        !          2737:        user_misc=user_flags2[0]=user_flags3[0]=user_flags4[0]=0;
        !          2738:        user_rest[0]=user_exempt[0]=0;
        !          2739:        user_sex=user_address[0]=user_zipcode[0]=user_realname[0]=0;
        !          2740:        str[0]=0;
        !          2741:        fgets(str,81,fp);                               // 01: COM port - if local
        !          2742:        if(com_port==-1)
        !          2743:                com_port=atoi(str+3);
        !          2744:        str[0]=0;
        !          2745:        fgets(str,81,fp);                               // 02: DCE Rate
        !          2746:        user_dce=atoi(str);
        !          2747:        fgets(str,81,fp);                               // 03: Data bits
        !          2748:        str[0]=0;
        !          2749:        fgets(str,81,fp);                               // 04: Node num
        !          2750:        node_num=atoi(str);
        !          2751:        str[0]=0;
        !          2752:        fgets(str,81,fp);                               // 05: DTE rate
        !          2753:        if(!com_rate)
        !          2754:                com_rate=atol(str);
        !          2755:        fgets(str,81,fp);                               // 06: Screen display
        !          2756:        fgets(str,81,fp);                               // 07: Printer toggle
        !          2757:        fgets(str,81,fp);                               // 08: Page bell
        !          2758:        fgets(str,81,fp);                               // 09: Caller alarm
        !          2759:        str[0]=0;
        !          2760:        fgets(str,81,fp);                               // 10: User name
        !          2761:        sprintf(user_name,"%.25s",str);
        !          2762:        truncsp(user_name);
        !          2763:        str[0]=0;
        !          2764:        fgets(str,81,fp);                               // 11: User location
        !          2765:        sprintf(user_location,"%.30s",str);
        !          2766:        truncsp(user_location);
        !          2767:        str[0]=0;
        !          2768:        fgets(str,81,fp);                               // 12: Home phone
        !          2769:        sprintf(user_phone,"%.12s",str);
        !          2770:        truncsp(user_phone);
        !          2771:        fgets(str,81,fp);                               // 13: Work phone
        !          2772:        fgets(str,81,fp);                               // 14: Password
        !          2773:        str[0]=0;
        !          2774:        fgets(str,81,fp);                               // 15: Security Level
        !          2775:        user_level=atoi(str);
        !          2776:        fgets(str,81,fp);                               // 16: Total logons
        !          2777:        fgets(str,81,fp);                               // 17: Last on date
        !          2778:        str[0]=0;
        !          2779:        fgets(str,81,fp);                               // 18: Time left in seconds
        !          2780:        timeleft=atoi(str);
        !          2781:        fgets(str,81,fp);                               // 19: Time left in minutes
        !          2782:        str[0]=0;
        !          2783:        fgets(str,81,fp);                               // 20: Graphics
        !          2784:        if(!strnicmp(str,"GR",2))
        !          2785:                user_misc|=(COLOR|ANSI);
        !          2786:        str[0]=0;
        !          2787:        fgets(str,81,fp);                               // 21: Screen length
        !          2788:        user_rows=atoi(str);
        !          2789:        if(user_rows<10)
        !          2790:                user_rows=24;
        !          2791:        fgets(str,81,fp);                               // 22: Expert?
        !          2792:        str[0]=0;
        !          2793:        fgets(str,81,fp);                               // 23: Registered conferences
        !          2794:        sprintf(user_flags1,"%.26s",str);
        !          2795:        truncsp(user_flags1);
        !          2796:        fgets(str,81,fp);                               // 24: Conference came from
        !          2797:        str[0]=0;
        !          2798:        fgets(str,81,fp);                               // 25: User's expiration date
        !          2799:        user_expire=dstrtounix(str);
        !          2800:        str[0]=0;
        !          2801:        fgets(str,81,fp);                               // 26: User's number
        !          2802:        user_number=atoi(str);
        !          2803:        fgets(str,81,fp);                               // 27: Default protocol
        !          2804:        fgets(str,81,fp);                               // 28: Total uploads
        !          2805:        fgets(str,81,fp);                               // 29: Total downloads
        !          2806:        fgets(str,81,fp);                               // 30: Kbytes downloaded today
        !          2807:        str[0]=0;
        !          2808:        fgets(str,81,fp);                               // 31: Max Kbytes to download today
        !          2809:        user_cdt=atol(str)*1024UL;
        !          2810:        str[0]=0;
        !          2811:        fgets(str,81,fp);                               // 32: Birthday
        !          2812:        truncsp(str);
        !          2813:        sprintf(user_birth,"%.8s",str);
        !          2814:        fgets(str,81,fp);                               // 33: Path to MAIN
        !          2815:        fgets(str,81,fp);                               // 34: Path to GEN
        !          2816:        str[0]=0;
        !          2817:        fgets(str,81,fp);                                // 35: Sysop's name
        !          2818:        sprintf(sys_op,"%.40s",str);
        !          2819:        truncsp(sys_op);
        !          2820:        fclose(fp);
        !          2821:        con_fp=stderr;
        !          2822:        if(setmode(fileno(con_fp),O_BINARY)==-1) {       /* eliminate LF expansion */
        !          2823:                printf("Can't set console output to BINARY\n");
        !          2824:                exit(1); }
        !          2825:        }
        !          2826: 
        !          2827: if(!user_number) {
        !          2828:        printf("\7\nERROR: Invalid user number (%u)\n",user_number);
        !          2829:        exit(5); }
        !          2830: 
        !          2831: if(*(&riobp-1)!=23) {
        !          2832:     printf("Wrong rciol.obj\n");
        !          2833:     exit(1); }
        !          2834: 
        !          2835: node_scrnlen=lclini(0xd<<8);     /* Tab expansion, no CRLF expansion */
        !          2836: lclini(node_scrnlen-1);
        !          2837: 
        !          2838: if(com_port) {
        !          2839:        lprintf("\r\nInitializing COM port %u: ",com_port);
        !          2840:        switch(com_base) {
        !          2841:                case 0xb:
        !          2842:                        lputs("PC BIOS");
        !          2843:                        rioctl(I14PC);
        !          2844:                        if(!com_irq) com_irq=com_port-1;
        !          2845:                        break;
        !          2846:                case 0xffff:
        !          2847:                case 0xd:
        !          2848:                        lputs("DigiBoard");
        !          2849:                        rioctl(I14DB);
        !          2850:                        if(!com_irq) com_irq=com_port-1;
        !          2851:                        break;
        !          2852:                case 0xe:
        !          2853:                        lputs("PS/2 BIOS");
        !          2854:                        rioctl(I14PS);
        !          2855:                        if(!com_irq) com_irq=com_port-1;
        !          2856:                        break;
        !          2857:                case 0xf:
        !          2858:                        lputs("FOSSIL");
        !          2859:                        rioctl(I14FO);
        !          2860:                        if(!com_irq) com_irq=com_port-1;
        !          2861:                        break;
        !          2862:                case 0:
        !          2863:                        base=com_port;
        !          2864:                        lputs("UART I/O (BIOS), ");
        !          2865:                        if(com_irq)
        !          2866:                                lprintf("IRQ %d",com_irq);
        !          2867:                        else lputs("default IRQ");
        !          2868:                        break;
        !          2869:                default:
        !          2870:                        base=com_base;
        !          2871:                        lprintf("UART I/O %Xh, ",com_base);
        !          2872:                        if(com_irq)
        !          2873:                                lprintf("IRQ %d",com_irq);
        !          2874:                        else lputs("default IRQ");
        !          2875:                        break; }
        !          2876: 
        !          2877:        if(base==0xffff)
        !          2878:                lprintf(" channel %u",com_irq);
        !          2879:        i=rioini(base,com_irq);
        !          2880:        if(i) {
        !          2881:                lprintf(" - Failed! (%d)\r\n",i);
        !          2882:                exit(1); }
        !          2883:        if(mdm_misc&MDM_FLOWCTRL)
        !          2884:                rioctl(IOSM|CTSCK|RTSCK); /* set rts/cts chk */
        !          2885:        if(com_rate)
        !          2886:                setbaud((uint)(com_rate&0xffffL));
        !          2887:        msr=&riobp-1; }
        !          2888: 
        !          2889: /* STATUS LINE */
        !          2890: statusline();
        !          2891: 
        !          2892: rioctl(TSTYPE|mswtyp);  /* set time-slice API type */
        !          2893: 
        !          2894: rioctl(CPTON);                 /* ctrl-p translation */
        !          2895: 
        !          2896: i=INT29L;
        !          2897: if(com_port)
        !          2898:        i|=(INT29R|INT16);
        !          2899: ivhctl(i);
        !          2900: io_int=1;
        !          2901: 
        !          2902: atexit(smm_exit);
        !          2903: 
        !          2904: printf("\r\nSynchronet Match Maker  v%s  Developed 1995-1997 Rob Swindell\n\n"
        !          2905:     ,SMM_VER);
        !          2906: 
        !          2907: if(checktime()) {
        !          2908:     printf("Time problem!\n");
        !          2909:     return; }
        !          2910: 
        !          2911: if((file=nopen("SMM.CFG",O_RDONLY))==-1) {
        !          2912:        bprintf("\r\n\7Error opening/creating SMM.DAB\r\n");
        !          2913:     exit(1); }
        !          2914: if((stream=fdopen(file,"w+b"))==NULL) {
        !          2915:        bprintf("\r\n\7Error converting SMM.DAB file handle to stream\r\n");
        !          2916:     exit(1); }
        !          2917: str[0]=0;
        !          2918: fgets(str,128,stream);
        !          2919: purity_age=atoi(str);
        !          2920: str[0]=0;
        !          2921: fgets(str,128,stream);
        !          2922: min_age=atoi(str);
        !          2923: str[0]=0;
        !          2924: fgets(str,128,stream);
        !          2925: min_level=atoi(str);
        !          2926: 
        !          2927: req_flags1[0]=0;
        !          2928: fgets(req_flags1,128,stream);
        !          2929: req_flags1[27]=0;
        !          2930: truncsp(req_flags1);
        !          2931: 
        !          2932: req_flags2[0]=0;
        !          2933: fgets(req_flags2,128,stream);
        !          2934: req_flags2[27]=0;
        !          2935: truncsp(req_flags2);
        !          2936: 
        !          2937: req_flags3[0]=0;
        !          2938: fgets(req_flags3,128,stream);
        !          2939: req_flags3[27]=0;
        !          2940: truncsp(req_flags3);
        !          2941: 
        !          2942: req_flags4[0]=0;
        !          2943: fgets(req_flags4,128,stream);
        !          2944: req_flags4[27]=0;
        !          2945: truncsp(req_flags4);
        !          2946: 
        !          2947: str[0]=0;
        !          2948: fgets(str,128,stream);
        !          2949: profile_cdt=atol(str);
        !          2950: str[0]=0;
        !          2951: fgets(str,128,stream);
        !          2952: telegram_cdt=atol(str);
        !          2953: str[0]=0;
        !          2954: fgets(str,128,stream);
        !          2955: auto_update=atoi(str);
        !          2956: str[0]=0;
        !          2957: fgets(str,128,stream);
        !          2958: notify_user=atoi(str);
        !          2959: 
        !          2960: fgets(str,128,stream);         // regnum
        !          2961: 
        !          2962: str[0]=0;
        !          2963: fgets(str,128,stream);
        !          2964: telegram_level=atoi(str);
        !          2965: 
        !          2966: str[0]=0;
        !          2967: fgets(str,128,stream);
        !          2968: que_level=atoi(str);
        !          2969: 
        !          2970: str[0]=0;
        !          2971: fgets(str,128,stream);
        !          2972: wall_level=atoi(str);
        !          2973: 
        !          2974: str[0]=0;
        !          2975: fgets(str,128,stream);
        !          2976: wall_cdt=atol(str);
        !          2977: 
        !          2978: str[0]=0;
        !          2979: fgets(str,128,stream);
        !          2980: que_cdt=atol(str);
        !          2981: 
        !          2982: fgets(zmodem_send,128,stream);
        !          2983: if(!zmodem_send[0])
        !          2984:     strcpy(zmodem_send,DEFAULT_ZMODEM_SEND);
        !          2985: truncsp(zmodem_send);
        !          2986: 
        !          2987: str[0]=0;
        !          2988: fgets(str,128,stream);
        !          2989: smm_misc=atol(str);
        !          2990: 
        !          2991: fgets(str,128,stream);
        !          2992: sprintf(system_name,"%.40s",str);
        !          2993: truncsp(system_name);
        !          2994: 
        !          2995: fgets(local_view,128,stream);
        !          2996: truncsp(local_view);
        !          2997: 
        !          2998: str[0]=0;
        !          2999: fgets(str,128,stream);
        !          3000: sysop_level=atoi(str);
        !          3001: if(!sysop_level)
        !          3002:     sysop_level=90;
        !          3003: 
        !          3004: str[0]=0;
        !          3005: fgets(str,128,stream);
        !          3006: wall_age=atoi(str);
        !          3007: 
        !          3008: str[0]=0;
        !          3009: fgets(str,128,stream);
        !          3010: age_split=atoi(str);
        !          3011: 
        !          3012: fclose(stream);
        !          3013: 
        !          3014: if(!system_name[0] && sys_name[0])
        !          3015:        strcpy(system_name,sys_name);
        !          3016: if(!system_name[0]) {
        !          3017:     printf("\7\nERROR: System name not specified\n");
        !          3018:     exit(3) ; }
        !          3019: 
        !          3020: sprintf(str,"%.25s",system_name);
        !          3021: strupr(str);
        !          3022: system_crc=crc32(str);
        !          3023: 
        !          3024: if((file=open("SMM.DAB",O_RDWR|O_BINARY|SH_DENYNO|O_CREAT
        !          3025:     ,S_IWRITE|S_IREAD))==-1) {
        !          3026:        bprintf("\r\n\7Error opening/creating SMM.DAB\r\n");
        !          3027:     exit(1); }
        !          3028: if((stream=fdopen(file,"w+b"))==NULL) {
        !          3029:        bprintf("\r\n\7Error converting SMM.DAB file handle to stream\r\n");
        !          3030:     exit(1); }
        !          3031: setvbuf(stream,0L,_IOFBF,4096);
        !          3032: 
        !          3033: if((file=open("SMM.IXB",O_RDWR|O_BINARY|SH_DENYNO|O_CREAT
        !          3034:     ,S_IWRITE|S_IREAD))==-1) {
        !          3035:        bprintf("\r\n\7Error opening/creating SMM.IXB\r\n");
        !          3036:     exit(1); }
        !          3037: if((index=fdopen(file,"w+b"))==NULL) {
        !          3038:        bprintf("\r\n\7Error converting SMM.IXB file handle to stream\r\n");
        !          3039:     exit(1); }
        !          3040: setvbuf(stream,0L,_IOFBF,1024);
        !          3041: 
        !          3042: trashfile=NULL;
        !          3043: if((file=open("SMM.CAN",O_RDONLY|SH_DENYNO))!=-1) {
        !          3044:        trashfile=fdopen(file,"rb");
        !          3045:        setvbuf(trashfile,NULL,_IOFBF,4096); }
        !          3046: 
        !          3047: total_ques=0;
        !          3048: i=nopen("QUE.LST",O_RDONLY);
        !          3049: if(i!=-1)
        !          3050:        que_lst=fdopen(i,"rb");
        !          3051: else
        !          3052:        que_lst=NULL;
        !          3053: i=0;
        !          3054: while(que_lst && !feof(que_lst) && i<5) {
        !          3055:        if(!fgets(name,81,que_lst))
        !          3056:                break;
        !          3057:        truncsp(name);
        !          3058:        strupr(name);
        !          3059:        sprintf(str,"%s.QUE",name);
        !          3060:        if(!fgets(desc,81,que_lst))
        !          3061:                break;
        !          3062:        truncsp(desc);
        !          3063:        if(!fgets(tmp,81,que_lst))
        !          3064:                break;
        !          3065:        truncsp(tmp);
        !          3066:        if((file=nopen(str,O_RDONLY))!=-1) {
        !          3067:                fp=fdopen(file,"rb");
        !          3068:                total_ques++;
        !          3069:                if((que[i]=(questionnaire_t *)MALLOC(sizeof(questionnaire_t)))==NULL) {
        !          3070:                        bprintf("Can't malloc questionnaires!\r\n");
        !          3071:                        exit(1); }
        !          3072:                sprintf(que[i]->name,"%.8s",name);
        !          3073:                sprintf(que[i]->desc,"%.25s",desc);
        !          3074:                que[i]->req_age=atoi(tmp);
        !          3075:                fgets(str,128,fp);
        !          3076:                que[i]->total_ques=atoi(str);
        !          3077:                if(que[i]->total_ques<1 || que[i]->total_ques>20) {
        !          3078:                        bprintf("Invalid number of questions (%d) in questionnaire #%d\r\n"
        !          3079:                                ,que[i]->total_ques,i+1);
        !          3080:                        exit(1); }
        !          3081:                for(j=0;j<que[i]->total_ques;j++) {
        !          3082:                        if(!fgets(str,128,fp))
        !          3083:                                break;
        !          3084:                        truncsp(str);
        !          3085:                        if(!str[0])
        !          3086:                                break;
        !          3087:                        str[80]=0;
        !          3088:                        strcpy(que[i]->que[j].txt,str);
        !          3089:                        fgets(str,128,fp);
        !          3090:                        que[i]->que[j].answers=atoi(str);
        !          3091:                        if(que[i]->que[j].answers<1 || que[i]->que[j].answers>16) {
        !          3092:                                bprintf("Invalid number of answers (%d) in question #%d "
        !          3093:                                        "of questionnaire #%d\r\n"
        !          3094:                                        ,que[i]->que[j].answers,j+1,i+1);
        !          3095:                                exit(1); }
        !          3096:                        fgets(str,128,fp);
        !          3097:                        que[i]->que[j].allowed=atoi(str);
        !          3098:                        for(k=0;k<que[i]->que[j].answers;k++) {
        !          3099:                                if(!fgets(str,128,fp))
        !          3100:                                        break;
        !          3101:                                truncsp(str);
        !          3102:                                if(!str[0])
        !          3103:                                        break;
        !          3104:                                str[60]=0;
        !          3105:                                strcpy(que[i]->que[j].ans[k],str); }
        !          3106:                        que[i]->que[j].answers=k; }
        !          3107: 
        !          3108:                que[i]->total_ques=j; }
        !          3109:        fclose(fp);
        !          3110:        i++; }
        !          3111: fclose(que_lst);
        !          3112: 
        !          3113: lncntr=0;
        !          3114: getsmsg(user_number);
        !          3115: if(lncntr)
        !          3116:        pause();
        !          3117: 
        !          3118: memset(&useron,0,sizeof(user_t));
        !          3119: 
        !          3120: atexit(smm_exit);
        !          3121: 
        !          3122: bputs("\1n\1hSearching for your profile...");
        !          3123: rewind(index);
        !          3124: while(!feof(index)) {
        !          3125:        if(!fread(&ixb,sizeof(ixb_t),1,index))
        !          3126:                break;
        !          3127:        if(ixb.system==system_crc && ixb.number==user_number) {
        !          3128:                useron_record=(ftell(index)-sizeof(ixb_t))/sizeof(ixb_t);
        !          3129:                fseek(stream,useron_record*sizeof(user_t),SEEK_SET);
        !          3130:                fread(&user,sizeof(user_t),1,stream);
        !          3131:                if(stricmp(user.realname,user_name)) {  /* new name, so delete it */
        !          3132:                        user.misc|=USER_DELETED;
        !          3133:                        fseek(stream,ftell(stream)-sizeof(user_t),SEEK_SET);
        !          3134:                        fwrite(&user,sizeof(user_t),1,stream);
        !          3135:                        fseek(stream,0,SEEK_CUR);
        !          3136:                        fseek(index,ftell(index)-sizeof(ixb_t),SEEK_SET);
        !          3137:                        ixb.number=0;
        !          3138:                        fwrite(&ixb,sizeof(ixb_t),1,index);
        !          3139:                        sprintf(str,"%04u.MSG",user_number);
        !          3140:                        remove(str);
        !          3141:                        continue; }
        !          3142:                useron=user;            /* name matches, same user */
        !          3143:                break; } }
        !          3144: fflush(stream);
        !          3145: fflush(index);
        !          3146: CRLF;
        !          3147: 
        !          3148: if(useron.number && useron.sex!='M' && useron.sex!='F') {
        !          3149:        if(yesno("Are you of male gender"))
        !          3150:                useron.sex='M';
        !          3151:        else
        !          3152:                useron.sex='F';
        !          3153:        write_user();
        !          3154:        user_sex=useron.sex; }
        !          3155: 
        !          3156: if(!useron.number && user_sex!='M' && user_sex!='F' && can_add()) {
        !          3157:        if(yesno("Are you of male gender"))
        !          3158:                user_sex='M';
        !          3159:        else
        !          3160:                user_sex='F'; }
        !          3161: 
        !          3162: if(!useron.number && can_add()) {
        !          3163:        sprintf(str,"%04u.MSG",user_number);
        !          3164:        remove(str);
        !          3165:        printfile("SMM_LOGO.ASC");
        !          3166:        if(yesno("\r\nYour profile doesn't exist. Create it now"))
        !          3167:                add_userinfo(); }
        !          3168: 
        !          3169: if(gotoname[0]) {
        !          3170:        strupr(gotoname);
        !          3171:        name_crc=crc32(gotoname);
        !          3172:        rewind(index);
        !          3173:        i=0;
        !          3174:        while(!feof(index)) {
        !          3175:                if(!fread(&ixb,sizeof(ixb_t),1,index))
        !          3176:                        break;
        !          3177:                if(!ixb.number)    /* DELETED */
        !          3178:                        continue;
        !          3179:                if(ixb.name!=name_crc)
        !          3180:                        continue;
        !          3181:                fseek(stream
        !          3182:                        ,((ftell(index)-sizeof(ixb_t))/sizeof(ixb_t))
        !          3183:                        *sizeof(user_t),SEEK_SET);
        !          3184:                if(!fread(&user,sizeof(user_t),1,stream))
        !          3185:                        continue;
        !          3186:                if(minor_protection(user))
        !          3187:                        continue;
        !          3188:                i=1;
        !          3189:                if(!long_user_info(user))
        !          3190:                        break; }
        !          3191:        if(!i) {
        !          3192:                bprintf("\r\n\1n\1h%s \1rnot found.\r\n",gotoname);
        !          3193:                pause(); }
        !          3194:        return; }
        !          3195: 
        !          3196: /*********************************************/
        !          3197: /* ALL User Messages (from Digital Dynamics) */
        !          3198: /*********************************************/
        !          3199: for(i=findfirst("ALL*.MSG",&ff,0);!i;i=findnext(&ff)) {
        !          3200:        if((j=nopen(ff.ff_name,O_RDONLY))==-1) {
        !          3201:                bprintf("\1n\1r\1hCan't open \1w%s\r\n",ff.ff_name);
        !          3202:                pause();
        !          3203:                continue; }
        !          3204:        if((fp=fdopen(j,"rb"))==NULL) {
        !          3205:                bprintf("\1n\1r\1hCan't fdopen \1w%s\r\n",ff.ff_name);
        !          3206:                pause();
        !          3207:                continue; }
        !          3208:        str[0]=0;
        !          3209:        fgets(str,128,fp);
        !          3210:        truncsp(str);
        !          3211:        ul=ahtoul(str);    /* Expiration date */
        !          3212:        ul^=0x305F6C81UL;
        !          3213:        attr(LIGHTGRAY);
        !          3214:        cls();
        !          3215:        while(!feof(fp)) {
        !          3216:                if(!fgets(str,128,fp))
        !          3217:                        break;
        !          3218:                bputs(str); }
        !          3219:        fclose(fp);
        !          3220:        CRLF;
        !          3221:        if(ul<=time(NULL))
        !          3222:                remove(ff.ff_name); }
        !          3223: 
        !          3224: /**************************************************/
        !          3225: /* One-time User Messages (from Digital Dynamics) */
        !          3226: /**************************************************/
        !          3227: for(i=findfirst("ONE*.MSG",&ff,0);!i;i=findnext(&ff)) {
        !          3228:        if(fdate_dir(ff.ff_name)<useron.lastin)
        !          3229:                continue;
        !          3230:        if((j=nopen(ff.ff_name,O_RDONLY))==-1) {
        !          3231:                bprintf("\1n\1r\1hCan't open \1w%s\r\n",ff.ff_name);
        !          3232:                pause();
        !          3233:                continue; }
        !          3234:        if((fp=fdopen(j,"rb"))==NULL) {
        !          3235:                bprintf("\1n\1r\1hCan't fdopen \1w%s\r\n",ff.ff_name);
        !          3236:                pause();
        !          3237:                continue; }
        !          3238:        str[0]=0;
        !          3239:        fgets(str,128,fp);
        !          3240:        truncsp(str);
        !          3241:        ul=ahtoul(str);    /* Expiration date */
        !          3242:        ul^=0x305F6C81UL;
        !          3243:        attr(LIGHTGRAY);
        !          3244:        cls();
        !          3245:        while(!feof(fp)) {
        !          3246:                if(!fgets(str,128,fp))
        !          3247:                        break;
        !          3248:                bputs(str); }
        !          3249:        fclose(fp);
        !          3250:        CRLF;
        !          3251:        if(ul<=time(NULL))
        !          3252:         remove(ff.ff_name); }
        !          3253: 
        !          3254: /******************************************/
        !          3255: /* Sysop Messages (from Digital Dynamics) */
        !          3256: /******************************************/
        !          3257: for(i=findfirst("SYS*.MSG",&ff,0);SYSOP && !i;i=findnext(&ff)) {
        !          3258:        if((j=nopen(ff.ff_name,O_RDONLY))==-1) {
        !          3259:                bprintf("\1n\1r\1hCan't open \1w%s\r\n",ff.ff_name);
        !          3260:                pause();
        !          3261:                continue; }
        !          3262:        if((fp=fdopen(j,"rb"))==NULL) {
        !          3263:                bprintf("\1n\1r\1hCan't fdopen \1w%s\r\n",ff.ff_name);
        !          3264:                pause();
        !          3265:                continue; }
        !          3266:        str[0]=0;
        !          3267:        fgets(str,128,fp);
        !          3268:        truncsp(str);
        !          3269:        ul=ahtoul(str);    /* Expiration date */
        !          3270:        ul^=0x305F6C81UL;
        !          3271:        attr(LIGHTGRAY);
        !          3272:        cls();
        !          3273:        while(!feof(fp)) {
        !          3274:                if(!fgets(str,128,fp))
        !          3275:                        break;
        !          3276:                bputs(str); }
        !          3277:        fclose(fp);
        !          3278:        CRLF;
        !          3279:        if(ul<=time(NULL) || !noyes("Delete message"))
        !          3280:         remove(ff.ff_name); }
        !          3281: 
        !          3282: statusline();
        !          3283: while(1) {
        !          3284:        checkline();
        !          3285:        aborted=0;
        !          3286:        attr(LIGHTGRAY);
        !          3287:        cls();
        !          3288: 
        !          3289:        bprintf("\1n  \1b\1hSynchronet \1cMatch Maker  \1bv%s (XSDK v%s)  "
        !          3290:                "Developed 1995-1997 Rob Swindell\1n\r\n\r\n",SMM_VER,xsdk_ver);
        !          3291:        printfile("SMM_LOGO.ASC");
        !          3292:        CRLF;
        !          3293: 
        !          3294:        l=filelength(fileno(stream));
        !          3295:        if(l<0) l=0;
        !          3296:        sprintf(str,"\1n\1cThere are \1h%lu\1n\1c entries in the user profile "
        !          3297:                "database.\r\n",l/(long)sizeof(user_t));
        !          3298:        center(str);
        !          3299: 
        !          3300:        sprintf(str,"%04u.MSG",user_number);
        !          3301:        if(fexist(str))
        !          3302:                center("\1h\1mYou have awaiting telegrams!\r\n");
        !          3303: 
        !          3304:        if(flength("WALL.DAB")>0)
        !          3305:                center("\1h\1cThere is writing on the Wall.\r\n");
        !          3306: 
        !          3307:        if(!useron.number)
        !          3308:                center("\1h\1rYou have not yet created a profile!\r\n");
        !          3309: 
        !          3310:        printfile("SMM_MAIN.ASC");
        !          3311: 
        !          3312:        nodesync();                     /* Display any waiting messages */
        !          3313: 
        !          3314:        bprintf("\r\n%32s\1b\1hWhich or [\1wQ\1b]uit: \1h\1w",nulstr);
        !          3315:        ch=getkey(K_UPPER);
        !          3316: //       bprintf("%c\r\n",ch);
        !          3317:        bputs("\r\1>");
        !          3318:        switch(ch) {
        !          3319:                case '?':
        !          3320:                        break;
        !          3321:                case '*':
        !          3322:                        if(!SYSOP)
        !          3323:                                break;
        !          3324:                        bputs("\1n\1hSearching...");
        !          3325:                        rewind(stream);
        !          3326:                        while(!feof(stream) && !aborted) {
        !          3327:                                if(!fread(&user,sizeof(user_t),1,stream))
        !          3328:                                        break;
        !          3329:                                if(user.misc&USER_DELETED) {
        !          3330:                                        sprintf(str,"\r\nUndelete \1c%s \1b(\1c%s@%s\1b)"
        !          3331:                                                ,user.name,user.realname,user.system);
        !          3332:                                        if(!yesno(str))
        !          3333:                                                continue;
        !          3334:                                        fseek(stream,ftell(stream)-sizeof(user_t),SEEK_SET);
        !          3335:                                        user.misc&=~USER_DELETED;
        !          3336:                                        fwrite(&user,sizeof(user_t),1,stream);
        !          3337:                                        fseek(stream,0,SEEK_CUR);
        !          3338:                                        fseek(index
        !          3339:                                                ,((ftell(stream)-sizeof(user_t))/sizeof(user_t))
        !          3340:                                                *sizeof(ixb_t),SEEK_SET);
        !          3341:                                        strcpy(str,user.name);
        !          3342:                                        strupr(str);
        !          3343:                                        ixb.name=crc32(str);
        !          3344:                                        sprintf(str,"%.25s",user.system);
        !          3345:                                        strupr(str);
        !          3346:                                        ixb.system=crc32(str);
        !          3347:                                        ixb.updated=user.updated;
        !          3348:                                        ixb.number=user.number;
        !          3349:                                        fwrite(&ixb,sizeof(ixb_t),1,index);
        !          3350:                                        } }
        !          3351:                        fflush(stream);
        !          3352:                        fflush(index);
        !          3353:                        break;
        !          3354:                case '!':
        !          3355:                        if(!SYSOP)
        !          3356:                                break;
        !          3357:                        cls();
        !          3358:                        bputs("\1n\1hSystems Participating in Your Database:\r\n\r\n\1m");
        !          3359:                        crc_lst=NULL;
        !          3360:                        j=0;
        !          3361:                        rewind(stream);
        !          3362:                        while(!feof(stream) && !aborted) {
        !          3363:                                if(!fread(&user,sizeof(user_t),1,stream))
        !          3364:                     break;
        !          3365:                                if(user.misc&USER_DELETED || !(user.misc&USER_FROMSMB))
        !          3366:                                        continue;
        !          3367:                                if(!smm_pause)
        !          3368:                                        lncntr=0;
        !          3369:                                sprintf(str,"%.25s",user.system);
        !          3370:                                strupr(str);
        !          3371:                                sys_crc=crc32(str);
        !          3372:                                for(i=0;i<j;i++)
        !          3373:                                        if(sys_crc==crc_lst[i])
        !          3374:                                                break;
        !          3375:                                if(i==j) {
        !          3376:                                        crc_lst=REALLOC(crc_lst,(j+1)*sizeof(ulong));
        !          3377:                                        if(crc_lst==NULL) {
        !          3378:                                                printf("REALLOC error!\n");
        !          3379:                                                pause();
        !          3380:                                                break; }
        !          3381:                                        crc_lst[j++]=sys_crc;
        !          3382:                                        bprintf("%s\r\n",user.system); } }
        !          3383:                        if(crc_lst)
        !          3384:                                FREE(crc_lst);
        !          3385:                        if(j)
        !          3386:                                bprintf("\1n\r\n\1h%u systems listed.\r\n",j);
        !          3387:                        pause();
        !          3388:                        break;
        !          3389:                case '\\':
        !          3390:                        if(!SYSOP)
        !          3391:                                break;
        !          3392:                        bprintf("Rebuilding Index...");
        !          3393:                        rewind(stream);
        !          3394:                        rewind(index);
        !          3395:                        while(!feof(stream)) {
        !          3396:                                if(!fread(&user,sizeof(user_t),1,stream))
        !          3397:                                        break;
        !          3398:                                if(user.misc&USER_DELETED)
        !          3399:                                        ixb.number=0;
        !          3400:                                else
        !          3401:                                        ixb.number=user.number;
        !          3402:                                strupr(user.name);
        !          3403:                                ixb.name=crc32(user.name);
        !          3404:                                strupr(user.system);
        !          3405:                                user.system[25]=0;
        !          3406:                                ixb.system=crc32(user.system);
        !          3407:                                ixb.updated=user.updated;
        !          3408:                                fwrite(&ixb,sizeof(ixb_t),1,index); }
        !          3409:                        break;
        !          3410:                case 'R':
        !          3411:                        if(useron.number) {
        !          3412:                                bputs("\1y\1hMinimum match percentage: \1w");
        !          3413:                                sprintf(str,"%u",useron.min_match);
        !          3414:                                if(!getstr(str,3,K_NUMBER|K_EDIT|K_AUTODEL) || aborted)
        !          3415:                                        break;
        !          3416:                                useron.min_match=atoi(str);
        !          3417:                                if(useron.min_match>100)
        !          3418:                                        useron.min_match=100; }
        !          3419:                        rewind(stream);
        !          3420:                        bprintf("\1n\1l\1hSearching...");
        !          3421:                        while(!feof(stream) && !aborted) {
        !          3422:                                if(!fread(&user,sizeof(user_t),1,stream))
        !          3423:                                        break;
        !          3424:                                if(user.misc&USER_DELETED)
        !          3425:                                        continue;
        !          3426:                                if(minor_protection(user))
        !          3427:                                        continue;
        !          3428:                                if(useron.min_match && useron.number) {
        !          3429:                                        match=total_match(useron,user);
        !          3430:                                        if(match<useron.min_match)
        !          3431:                                                continue; }
        !          3432:                                if(!long_user_info(user))
        !          3433:                                        break;
        !          3434:                                if(!smm_pause)
        !          3435:                                        lncntr=0;
        !          3436:                                bprintf("\1n\1l\1hSearching..."); }
        !          3437:                        break;
        !          3438:                case 'F':
        !          3439:                        bputs("\1y\1hText to search for: ");
        !          3440:                        if(!getstr(str,25,K_UPPER|K_LINE))
        !          3441:                 break;
        !          3442:                        ext=yesno("\r\nDisplay extended profiles");
        !          3443:                        cls();
        !          3444:                        if(!smm_pause && !ext)
        !          3445:                                printfile("LIST_HDR.ASC");
        !          3446:                        rewind(stream);
        !          3447:                        i=0;
        !          3448:                        while(!aborted) {
        !          3449:                                bprintf("\1n\1l\1hSearching...");
        !          3450:                                while(!feof(stream) && !aborted) {
        !          3451:                                        if(!fread(&user,sizeof(user_t),1,stream))
        !          3452:                                                break;
        !          3453:                                        if(user.misc&USER_DELETED)
        !          3454:                                                continue;
        !          3455:                                        if(minor_protection(user))
        !          3456:                                                continue;
        !          3457:                                        tmpuser=user;
        !          3458:                                        sprintf(tmp,"%lu",user.number);
        !          3459:                                        strupr(user.name);
        !          3460:                                        strupr(user.realname);
        !          3461:                                        strupr(user.system);
        !          3462:                                        strupr(user.location);
        !          3463:                                        strupr(user.note[0]);
        !          3464:                                        strupr(user.note[1]);
        !          3465:                                        strupr(user.note[2]);
        !          3466:                                        strupr(user.note[3]);
        !          3467:                                        strupr(user.note[4]);
        !          3468:                                        if(strstr(user.name,str)
        !          3469:                                                || strstr(user.location,str)
        !          3470:                                                || strstr(user.mbtype,str)
        !          3471:                                                || strstr(user.note[0],str)
        !          3472:                                                || strstr(user.note[1],str)
        !          3473:                                                || strstr(user.note[2],str)
        !          3474:                                                || strstr(user.note[3],str)
        !          3475:                                                || strstr(user.note[4],str)
        !          3476:                                                || (SYSOP && strstr(user.realname,str))
        !          3477:                                                || (SYSOP && strstr(user.system,str))
        !          3478:                                                || (SYSOP && !strcmp(tmp,str))
        !          3479:                                                ) {
        !          3480:                                                i=1;
        !          3481:                                                if(ext && !long_user_info(tmpuser))
        !          3482:                                                        break;
        !          3483:                                                if(!ext && short_user_info(tmpuser)==0)
        !          3484:                                                        break;
        !          3485:                                                if(!smm_pause)
        !          3486:                                                        lncntr=0; } }
        !          3487:                                if(aborted || ext || !lncntr)
        !          3488:                                        break;
        !          3489:                                user.number=0;
        !          3490:                                if(short_user_info(user)>=0)
        !          3491:                                        break; }
        !          3492:                        if(!i)
        !          3493:                                bprintf("\r\n\1n\1h%s \1rnot found.\r\n",str);
        !          3494:             break;
        !          3495:                case 'G':
        !          3496:                        bputs("\1y\1hUser name: ");
        !          3497:                        if(!getstr(str,25,K_UPPER|K_LINE))
        !          3498:                 break;
        !          3499:                        truncsp(str);
        !          3500:                        name_crc=crc32(str);
        !          3501:                        rewind(index);
        !          3502:                        i=0;
        !          3503:                        while(!feof(index)) {
        !          3504:                                if(!fread(&ixb,sizeof(ixb_t),1,index))
        !          3505:                                        break;
        !          3506:                                if(!ixb.number)    /* DELETED */
        !          3507:                                        continue;
        !          3508:                                if(ixb.name!=name_crc)
        !          3509:                                        continue;
        !          3510:                                fseek(stream
        !          3511:                                        ,((ftell(index)-sizeof(ixb_t))/sizeof(ixb_t))
        !          3512:                                        *sizeof(user_t),SEEK_SET);
        !          3513:                                if(!fread(&user,sizeof(user_t),1,stream))
        !          3514:                                        continue;
        !          3515:                                if(minor_protection(user))
        !          3516:                     continue;
        !          3517:                                i=1;
        !          3518:                                if(!long_user_info(user))
        !          3519:                                        break; }
        !          3520:                        if(!i)
        !          3521:                                bprintf("\r\n\1n\1h%s \1rnot found.\r\n",str);
        !          3522:             break;
        !          3523:                case 'L':
        !          3524:                        if(useron.number) {
        !          3525:                                bputs("\1y\1hMinimum match percentage: \1w");
        !          3526:                                sprintf(str,"%u",useron.min_match);
        !          3527:                                if(!getstr(str,3,K_NUMBER|K_EDIT|K_AUTODEL) || aborted)
        !          3528:                                        break;
        !          3529:                                useron.min_match=atoi(str);
        !          3530:                                if(useron.min_match>100)
        !          3531:                                        useron.min_match=100; }
        !          3532:                        cls();
        !          3533:                        if(!smm_pause)
        !          3534:                                printfile("LIST_HDR.ASC");
        !          3535:                        rewind(stream);
        !          3536:                        while(!aborted) {
        !          3537:                                while(!feof(stream) && !aborted) {
        !          3538:                                        if(!fread(&user,sizeof(user_t),1,stream))
        !          3539:                                                break;
        !          3540:                                        if(user.misc&USER_DELETED)
        !          3541:                                                continue;
        !          3542:                                        if(minor_protection(user))
        !          3543:                                                continue;
        !          3544:                                        if(useron.min_match && useron.number) {
        !          3545:                                                match=total_match(useron,user);
        !          3546:                                                if(match<useron.min_match)
        !          3547:                                                        continue; }
        !          3548:                                        if(!short_user_info(user))
        !          3549:                                                break;
        !          3550:                                        if(!smm_pause)
        !          3551:                                                lncntr=0; }
        !          3552:                                if(aborted || !lncntr)
        !          3553:                                        break;
        !          3554:                                user.number=0;
        !          3555:                                if(short_user_info(user)>=0)
        !          3556:                                        break; }
        !          3557:             break;
        !          3558: 
        !          3559:                case 'N':
        !          3560:                        while(1) {
        !          3561:                                checkline();
        !          3562:                                bputs("\1y\1hLast update (MM/DD/YY): ");
        !          3563:                                if(useron.number)
        !          3564:                                        unixtodstr(useron.lastin,str);
        !          3565:                                else
        !          3566:                                        str[0]=0;
        !          3567:                                if(!getstr(str,8,K_UPPER|K_LINE|K_EDIT|K_AUTODEL))
        !          3568:                                        break;
        !          3569:                                if(isdigit(str[0]) && isdigit(str[1]) && str[2]=='/'
        !          3570:                                        && isdigit(str[3]) && isdigit(str[4]) && str[5]=='/'
        !          3571:                                        && isdigit(str[6]) && isdigit(str[7]))
        !          3572:                                        break;
        !          3573:                                bputs("\r\n\1h\1rInvalid date!\r\n\r\n"); }
        !          3574:                        if(!str[0] || aborted)
        !          3575:                                break;
        !          3576:                        l=dstrtounix(str);
        !          3577:                        if(useron.number) {
        !          3578:                                bputs("\1y\1h\r\nMinimum match percentage: \1w");
        !          3579:                                sprintf(str,"%u",useron.min_match);
        !          3580:                                if(!getstr(str,3,K_NUMBER|K_EDIT|K_AUTODEL) || aborted)
        !          3581:                                        break;
        !          3582:                                useron.min_match=atoi(str);
        !          3583:                                if(useron.min_match>100)
        !          3584:                                        useron.min_match=100; }
        !          3585:                        ext=!noyes("\r\nDisplay extended profiles");
        !          3586:                        if(aborted)
        !          3587:                                break;
        !          3588:                        cls();
        !          3589:                        if(!ext && !smm_pause)
        !          3590:                                printfile("LIST_HDR.ASC");
        !          3591:                        rewind(index);
        !          3592:                        while(!aborted) {
        !          3593:                                while(!feof(index) && !aborted) {
        !          3594:                                        if(!smm_pause)
        !          3595:                                                lncntr=0;
        !          3596:                                        if(!fread(&ixb,sizeof(ixb_t),1,index))
        !          3597:                                                break;
        !          3598:                                        if(!ixb.number)         /* DELETED */
        !          3599:                                                continue;
        !          3600:                                        if(ixb.updated>=l) {
        !          3601:                                                fseek(stream
        !          3602:                                                        ,((ftell(index)-sizeof(ixb_t))/sizeof(ixb_t))
        !          3603:                                                        *sizeof(user_t),SEEK_SET);
        !          3604:                                                if(!fread(&user,sizeof(user_t),1,stream))
        !          3605:                                                        continue;
        !          3606:                                                if(minor_protection(user))
        !          3607:                                                        continue;
        !          3608:                                                if(useron.min_match && useron.number) {
        !          3609:                                                        match=total_match(useron,user);
        !          3610:                                                        if(match<useron.min_match)
        !          3611:                                                                continue; }
        !          3612:                                                if(ext && !long_user_info(user))
        !          3613:                                                        break;
        !          3614:                                                if(!ext && short_user_info(user)==0)
        !          3615:                                                        break;
        !          3616:                                                continue; } }
        !          3617:                                if(aborted || ext || !lncntr)
        !          3618:                                        break;
        !          3619:                                user.number=0;
        !          3620:                                if(short_user_info(user)>=0)
        !          3621:                                        break; }
        !          3622:             break;
        !          3623: 
        !          3624:                case 'U':
        !          3625:                case 'W':       /* Create/Edit Profile */
        !          3626:                        if(!can_add()) {
        !          3627:                                bprintf("\1h\1rYou have insufficient access to create a "
        !          3628:                                        "profile.\r\n\r\n");
        !          3629:                                break; }
        !          3630: 
        !          3631:                        if(!useron.number) {
        !          3632:                                add_userinfo();
        !          3633:                                break; }
        !          3634: 
        !          3635:                        user=useron;
        !          3636:                        tleft=timeleft;
        !          3637:                        if(!get_user_info(&user)) {
        !          3638:                                timeleft=tleft;
        !          3639:                                break; }
        !          3640: 
        !          3641:                        if(!memcmp(&user,&useron,sizeof(user_t))) {
        !          3642:                                timeleft=tleft;
        !          3643:                                break; }
        !          3644: 
        !          3645:                        if(!yesno("Save changes")) {
        !          3646:                                timeleft=tleft;
        !          3647:                                break; }
        !          3648:                        timeleft=tleft;
        !          3649:                        user.updated=time(NULL);
        !          3650:                        useron=user;
        !          3651:                        write_user();
        !          3652:             break;
        !          3653: 
        !          3654:                case 'D':
        !          3655:                        if(SYSOP) {
        !          3656:                                bputs("Name to Delete: ");
        !          3657:                                if(useron.number) {
        !          3658:                                        strcpy(str,useron.name);
        !          3659:                                        strupr(str); }
        !          3660:                                else
        !          3661:                                        str[0]=0;
        !          3662:                                getstr(str,25,K_UPPER|K_LINE|K_EDIT|K_AUTODEL);
        !          3663:                                rewind(stream);
        !          3664:                                while(!feof(stream)) {
        !          3665:                                        if(!fread(&user,sizeof(user_t),1,stream))
        !          3666:                                                break;
        !          3667:                                        strcpy(tmp,user.name);
        !          3668:                                        strupr(tmp);
        !          3669:                                        if(!(user.misc&USER_DELETED) && strstr(tmp,str)) {
        !          3670:                                                sprintf(tmp,"Delete %s (%s@%s)"
        !          3671:                                                        ,user.name,user.realname,user.system);
        !          3672:                                                i=noyes(tmp);
        !          3673:                                                if(aborted)
        !          3674:                                                        break;
        !          3675:                                                if(i)
        !          3676:                                                        continue;
        !          3677:                                                fseek(stream,ftell(stream)-sizeof(user_t),SEEK_SET);
        !          3678:                                                fseek(index
        !          3679:                                                        ,((ftell(stream)-sizeof(user_t))/sizeof(user_t))
        !          3680:                                                        *sizeof(ixb_t),SEEK_SET);
        !          3681:                                                user.misc|=USER_DELETED;
        !          3682:                                                fwrite(&user,sizeof(user_t),1,stream);
        !          3683:                                                fseek(stream,0,SEEK_CUR);
        !          3684:                                                memset(&ixb,0,sizeof(ixb_t));
        !          3685:                                                fwrite(&ixb,sizeof(ixb_t),1,index);
        !          3686:                                                fflush(stream);
        !          3687:                                                fflush(index);
        !          3688:                                                delphoto(user);
        !          3689:                                                if(user.number==user_number
        !          3690:                                                        && !stricmp(user.system,system_name))
        !          3691:                                                        useron.number=0;
        !          3692:                                                break; } }
        !          3693:                                if(aborted)
        !          3694:                                        break;
        !          3695:                                break; }
        !          3696:                        if(!useron.number) {
        !          3697:                                bputs("\1h\1rYour profile doesn't exist.\r\n\r\n");
        !          3698:                 break; }
        !          3699:                        if(noyes("Are you sure you want to delete your profile"))
        !          3700:                 break;
        !          3701:                        if(!cdt_warning(-profile_cdt))
        !          3702:                                break;
        !          3703:                        sprintf(str,"%04u.MSG",user_number);
        !          3704:                        remove(str);
        !          3705:                        fseek(stream,useron_record*sizeof(user_t),SEEK_SET);
        !          3706:                        useron.misc|=USER_DELETED;
        !          3707:                        fwrite(&useron,sizeof(user_t),1,stream);
        !          3708:                        fflush(stream);
        !          3709:                        memset(&ixb,0,sizeof(ixb_t));
        !          3710:                        fseek(index,useron_record*sizeof(ixb_t),SEEK_SET);
        !          3711:                        fwrite(&ixb,sizeof(ixb_t),1,index);
        !          3712:                        fflush(index);
        !          3713:                        delphoto(user);
        !          3714:                        useron.number=0;
        !          3715:                        aborted=0;
        !          3716:                        bputs("\r\n\1h\1r\1iProfile deleted.\r\n");
        !          3717:                        adjust_cdt(-profile_cdt);
        !          3718:             break;
        !          3719:                case 'P':
        !          3720:                        smm_pause=!smm_pause;
        !          3721:                        bprintf("\1r\1hScreen pause is now \1w%s\r\n\r\n"
        !          3722:                                ,smm_pause ? "ON":"OFF");
        !          3723:             break;
        !          3724:                case 'M':
        !          3725:                        mbtype_desc(useron.mbtype);
        !          3726:                        break;
        !          3727:                case 'H':
        !          3728:                        cls();
        !          3729:                        printfile("SMM_HELP.ASC");
        !          3730:                        break;
        !          3731:                case 'O':
        !          3732:                        if(noyes("Hang-up now"))
        !          3733:                                break;
        !          3734:                        dtr(5);
        !          3735:                        if(node_dir) {
        !          3736:                                sprintf(str,"%sHANGUP.NOW",node_dir);
        !          3737:                                fopen(str,"wb");
        !          3738:                                nodesync(); }
        !          3739:                        return;
        !          3740:                case 'S':
        !          3741:                        bputs("\1y\1hUser name: ");
        !          3742:                        if(!getstr(str,25,K_UPPER|K_LINE))
        !          3743:                 break;
        !          3744:                        truncsp(str);
        !          3745:                        name_crc=crc32(str);
        !          3746:                        rewind(index);
        !          3747:                        i=0;
        !          3748:                        while(!feof(index)) {
        !          3749:                                if(!fread(&ixb,sizeof(ixb_t),1,index))
        !          3750:                                        break;
        !          3751:                                if(!ixb.number)    /* DELETED */
        !          3752:                                        continue;
        !          3753:                                if(ixb.name!=name_crc)
        !          3754:                                        continue;
        !          3755:                 fseek(stream
        !          3756:                                        ,((ftell(index)-sizeof(ixb_t))/sizeof(ixb_t))
        !          3757:                                        *sizeof(user_t),SEEK_SET);
        !          3758:                                if(!fread(&user,sizeof(user_t),1,stream))
        !          3759:                                        continue;
        !          3760:                                if(minor_protection(user))
        !          3761:                     continue;
        !          3762:                                i=1;
        !          3763:                                if(send_telegram(user))
        !          3764:                                        break; }
        !          3765:                        if(!i)
        !          3766:                                bprintf("\r\n\1n\1h%s \1rnot found.\r\n",str);
        !          3767:             break;
        !          3768:                case 'T':
        !          3769:                        sprintf(str,"%04u.MSG",user_number);
        !          3770:                        if(!fexist(str)) {
        !          3771:                                bputs("\1r\1hYou have no telegrams waiting.\r\n\r\n");
        !          3772:                                break; }
        !          3773:                        cls();
        !          3774:                        printfile(str);
        !          3775:                        if(noyes("\r\nDelete all telegrams waiting for you"))
        !          3776:                                break;
        !          3777:                        remove(str);
        !          3778:                        break;
        !          3779:                case 'V':   /* Visit the wall */
        !          3780:                        if(getage(user_birth)<wall_age && !SYSOP) {
        !          3781:                                bputs("\1r\1hSorry, you're too young to view the wall.\r\n");
        !          3782:                                pause();
        !          3783:                                break; }
        !          3784:                        while(1) {
        !          3785:                                checkline();
        !          3786:                                bputs("\1y\1hView writing since (MM/DD/YY): ");
        !          3787:                 if(useron.number)
        !          3788:                     unixtodstr(useron.lastin,str);
        !          3789:                 else
        !          3790:                     str[0]=0;
        !          3791:                 if(!getstr(str,8,K_UPPER|K_LINE|K_EDIT|K_AUTODEL))
        !          3792:                     break;
        !          3793:                 if(isdigit(str[0]) && isdigit(str[1]) && str[2]=='/'
        !          3794:                     && isdigit(str[3]) && isdigit(str[4]) && str[5]=='/'
        !          3795:                     && isdigit(str[6]) && isdigit(str[7]))
        !          3796:                     break;
        !          3797:                 bputs("\r\n\1h\1rInvalid date!\r\n\r\n"); }
        !          3798:                        if(aborted)
        !          3799:                 break;
        !          3800:                        l=dstrtounix(str);
        !          3801:                        ext=yesno("\r\nDisplay extended information when available");
        !          3802:                        if(aborted)
        !          3803:                 break;
        !          3804:                        strcpy(str,"WALL.DAB");
        !          3805:                        if((file=sopen(str,O_RDWR|O_BINARY|O_CREAT,SH_DENYNO
        !          3806:                                ,S_IREAD|S_IWRITE))==-1) {
        !          3807:                                bprintf("\r\nError opening %s\r\n",str);
        !          3808:                                break; }
        !          3809:                        cls();
        !          3810:                        offset=0L;
        !          3811:                        while(!eof(file) && !aborted) {
        !          3812:                                if(read(file,&wall,sizeof(wall_t))!=sizeof(wall_t))
        !          3813:                                        break;
        !          3814:                                if(wall.imported<l)
        !          3815:                                        continue;
        !          3816:                                strcpy(str,wall.name);
        !          3817:                                strupr(str);
        !          3818:                                name_crc=crc32(str);
        !          3819:                                sprintf(str,"%.25s",wall.system);
        !          3820:                                strupr(str);
        !          3821:                                sys_crc=crc32(str);
        !          3822:                                rewind(index);
        !          3823:                                i=0;
        !          3824:                                user.sex=0;
        !          3825:                                while(ext && !feof(index) && !aborted) {
        !          3826:                                        if(!fread(&ixb,sizeof(ixb_t),1,index))
        !          3827:                                                break;
        !          3828:                                        if(!ixb.number)    /* DELETED */
        !          3829:                                                continue;
        !          3830:                                        if(ixb.name!=name_crc || ixb.system!=sys_crc)
        !          3831:                                                continue;
        !          3832:                                        fseek(stream
        !          3833:                                                ,((ftell(index)-sizeof(ixb_t))/sizeof(ixb_t))
        !          3834:                                                *sizeof(user_t),SEEK_SET);
        !          3835:                                        if(!fread(&user,sizeof(user_t),1,stream))
        !          3836:                                                continue;
        !          3837:                                        if(minor_protection(user))
        !          3838:                                                break;
        !          3839:                                        main_user_info(user);
        !          3840:                                        if(useron.number) {
        !          3841:                                                CRLF;
        !          3842:                                                bprintf("\1h\1mThis user meets your profile "
        !          3843:                                                        "preferences:\1w%3u%%            "
        !          3844:                                                        ,basic_match(useron,user));
        !          3845:                                                bprintf("\1n\1gCreated: \1h%s\r\n"
        !          3846:                                                        ,unixtodstr(user.created,str));
        !          3847:                                                bprintf("\1h\1mYou meet this user's profile "
        !          3848:                                                        "preferences:\1w%3u%%            "
        !          3849:                                                        ,basic_match(user,useron));
        !          3850:                                                bprintf("\1n\1gUpdated: \1h%s\r\n"
        !          3851:                                                        ,unixtodstr(user.updated,str)); }
        !          3852: 
        !          3853:                                        i=1;
        !          3854:                                        CRLF;
        !          3855:                                        break; }
        !          3856:                                if(!i) {
        !          3857:                                        if(ext)
        !          3858:                                                cls();
        !          3859:                                        bprintf("\1n\1h%s ",wall.name); }
        !          3860:                                bprintf("\1n\1h\1cWrote on %s:\r\n"
        !          3861:                                        ,timestr(&wall.written));
        !          3862:                                for(j=0;j<5;j++) {
        !          3863:                                        if(!wall.text[j][0])
        !          3864:                                                break;
        !          3865:                                        bprintf("\1n\1%c%5s%s\r\n"
        !          3866:                                                ,user.sex=='F'?'m':'g',"",wall.text[j]); }
        !          3867:                                if(aborted)
        !          3868:                                        break;
        !          3869:                                if(ext) {
        !          3870:                                        nodesync();
        !          3871:                                        if(i) {
        !          3872:                                                bputs(PrevReadSendQuitOrMore);
        !          3873:                                                ch=getkey(K_UPPER);
        !          3874:                                                if(ch=='R')
        !          3875:                                                        long_user_info(user);
        !          3876:                                                if(ch=='S')
        !          3877:                                                        send_telegram(user);
        !          3878:                                                if(ch=='R' || ch=='S')  /* Don't move forward */
        !          3879:                                                        lseek(file,tell(file)-sizeof(wall_t),SEEK_SET); }
        !          3880:                                        else {
        !          3881:                                                bputs("\r\n\1n\1hProfile not found.\r\n\r\n");
        !          3882:                                                bputs("\1b[\1cP\1b]revious, [\1cQ\1b]uit, "
        !          3883:                                                        "or [\1cM\1b]ore: \1c");
        !          3884:                                                ch=getkey(K_UPPER); }
        !          3885:                                        if(ch=='P') {
        !          3886:                                                lseek(file,offset,SEEK_SET);
        !          3887:                                                if(tell(file))
        !          3888:                                                        lseek(file,tell(file)-sizeof(wall_t),SEEK_SET);
        !          3889:                                                offset=tell(file);
        !          3890:                                                continue; }
        !          3891:                                        if(ch=='Q') {
        !          3892:                                                cls();
        !          3893:                                                break; }
        !          3894:                                        offset=tell(file); }
        !          3895:                                else if(lncntr+7>=user_rows || eof(file)) {
        !          3896:                                        lncntr=0;
        !          3897:                                        bputs(PrevReadSendQuitOrMore);
        !          3898:                                        ch=getkey(K_UPPER);
        !          3899:                                        if(ch=='Q')
        !          3900:                                                break;
        !          3901:                                        else if(ch=='S' || ch=='R') {
        !          3902:                                                bprintf("\1n\r\1>\1y\1hUser name: ");
        !          3903:                                                if(getstr(name,25,K_UPPER|K_LINE|K_NOCRLF)) {
        !          3904:                                                        truncsp(name);
        !          3905:                                                        name_crc=crc32(name);
        !          3906:                                                        rewind(index);
        !          3907:                                                        i=0;
        !          3908:                                                        while(!feof(index)) {
        !          3909:                                                                if(!fread(&ixb,sizeof(ixb_t),1,index))
        !          3910:                                                                        break;
        !          3911:                                                                if(!ixb.number)    /* DELETED */
        !          3912:                                                                        continue;
        !          3913:                                                                if(ixb.name!=name_crc)
        !          3914:                                                                        continue;
        !          3915:                                                                fseek(stream
        !          3916:                                                                        ,((ftell(index)
        !          3917:                                                                                -sizeof(ixb_t))/sizeof(ixb_t))
        !          3918:                                                                        *sizeof(user_t),SEEK_SET);
        !          3919:                                                                if(!fread(&user,sizeof(user_t),1,stream))
        !          3920:                                                                        continue;
        !          3921:                                                                if(minor_protection(user))
        !          3922:                                                                        continue;
        !          3923:                                                                i=1;
        !          3924:                                                                if(ch=='S' && send_telegram(user))
        !          3925:                                                                        break;
        !          3926:                                                                if(ch=='R' && !long_user_info(user))
        !          3927:                                                                        break;  }
        !          3928:                                                        if(!i)
        !          3929:                                                                bprintf("\r\n\1n\1h%s \1rnot found.\r\n",name);
        !          3930:                                                                }
        !          3931:                                                lseek(file,offset,SEEK_SET); }
        !          3932:                                        else if(ch=='P') {
        !          3933:                                                lseek(file,offset,SEEK_SET);
        !          3934:                                                for(i=0;i<4;i++)
        !          3935:                                                        if(tell(file))
        !          3936:                                                                lseek(file,tell(file)-sizeof(wall_t),SEEK_SET);
        !          3937:                                                }
        !          3938:                                        cls();
        !          3939:                                        offset=tell(file); } }
        !          3940:                        cls();
        !          3941:                        if(user_level<wall_level) {
        !          3942:                                close(file);
        !          3943:                 bputs("\r\n\1h\1rYou have insufficient access to write on the "
        !          3944:                     "wall.\r\n");
        !          3945:                 pause();
        !          3946:                 break; }
        !          3947:                        if(aborted || noyes("Write on the Wall")) {
        !          3948:                                close(file);
        !          3949:                                break; }
        !          3950:                        if(!useron.number) {
        !          3951:                                bputs("\r\n\1h\1rYou must create a profile first.\r\n");
        !          3952:                                close(file);
        !          3953:                                break; }
        !          3954:                        if(!cdt_warning(wall_cdt)) {
        !          3955:                                close(file);
        !          3956:                                break; }
        !          3957:                        memset(&wall,0,sizeof(wall_t));
        !          3958:                        strcpy(wall.name,useron.name);
        !          3959:                        strcpy(wall.system,system_name);
        !          3960:                        wall.written=wall.imported=time(NULL);
        !          3961:                        bputs("\1l\1n\1hWriting on the Wall:\r\n\r\n");
        !          3962:                        for(i=0;i<5 && !aborted;i++) {
        !          3963:                                bprintf("\1n\1h\1%c%u of 5: \1n\1%c"
        !          3964:                                        ,useron.sex=='F'?'m':'g',i+1,useron.sex=='F'?'m':'g');
        !          3965:                                if(!getstr(wall.text[i],70,i==4 ? K_MSG:K_MSG|K_WRAP))
        !          3966:                                        break;
        !          3967:                                if(trash(wall.text[i])) {
        !          3968:                                        bprintf("\r\n\1r\1hSorry, you can't use that text."
        !          3969:                                                "\r\n\r\n");
        !          3970:                                        i--;
        !          3971:                                        continue; } }
        !          3972:                        if(!i || aborted || !yesno("\r\nSave")) {
        !          3973:                                close(file);
        !          3974:                                break; }
        !          3975:                        lseek(file,0L,SEEK_END);
        !          3976:                        write(file,&wall,sizeof(wall_t));
        !          3977:                        close(file);
        !          3978:                        adjust_cdt(wall_cdt);
        !          3979:                        if(notify_user && notify_user!=user_number) {
        !          3980:                                sprintf(str,"\1n\1hSMM: \1y%s\1m wrote on the Match Maker "
        !          3981:                                        "Wall\r\n",user_name);
        !          3982:                                if(node_dir[0])
        !          3983:                                        putsmsg(notify_user,str);
        !          3984:                                else
        !          3985:                                        puttgram(notify_user,str); }
        !          3986:                        break;
        !          3987:                case 'Q':
        !          3988:                        return; } }
        !          3989: }
        !          3990: 
        !          3991: /* End of SMM.C */

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.