Annotation of sbbs/sbbs2/sbl/sbbslist.c, revision 1.1

1.1     ! root        1: /* SBBSLIST.C */
        !             2: 
        !             3: /* Developed 1990-1997 by Rob Swindell; PO Box 501, Yorba Linda, CA 92885 */
        !             4: 
        !             5: /* Converts Synchronet BBS List (SBL.DAB) to text file */
        !             6: 
        !             7: #include "xsdk.h"
        !             8: #include "sbldefs.h"
        !             9: 
        !            10: char *wday[]={"Sun","Mon","Tue","Wed","Thu","Fri","Sat"};
        !            11: char *mon[]={"Jan","Feb","Mar","Apr","May","Jun"
        !            12:             ,"Jul","Aug","Sep","Oct","Nov","Dec"};
        !            13: char *nulstr="";
        !            14: char tmp[256];
        !            15: struct date date;
        !            16: struct time curtime;
        !            17: 
        !            18: extern int daylight=0;
        !            19: extern long timezone=0L;
        !            20: 
        !            21: typedef struct {
        !            22: 
        !            23:        char    str[13];
        !            24:        short   offset;
        !            25: 
        !            26:     } sortstr_t;
        !            27: 
        !            28: 
        !            29: int sortstr_cmp(sortstr_t **str1, sortstr_t **str2)
        !            30: {
        !            31: return(stricmp((*str1)->str,(*str2)->str));
        !            32: }
        !            33: 
        !            34: /****************************************************************************/
        !            35: /* Generates a 24 character ASCII string that represents the time_t pointer */
        !            36: /* Used as a replacement for ctime()                                                                           */
        !            37: /****************************************************************************/
        !            38: char *timestr(time_t *intime)
        !            39: {
        !            40:        static char str[256];
        !            41:     char mer[3],hour;
        !            42:     struct tm *gm;
        !            43: 
        !            44: gm=localtime(intime);
        !            45: if(gm->tm_hour>=12) {
        !            46:     if(gm->tm_hour==12)
        !            47:         hour=12;
        !            48:     else
        !            49:         hour=gm->tm_hour-12;
        !            50:     strcpy(mer,"pm"); }
        !            51: else {
        !            52:     if(gm->tm_hour==0)
        !            53:         hour=12;
        !            54:     else
        !            55:         hour=gm->tm_hour;
        !            56:     strcpy(mer,"am"); }
        !            57: sprintf(str,"%s %s %02d %4d %02d:%02d %s"
        !            58:     ,wday[gm->tm_wday],mon[gm->tm_mon],gm->tm_mday,1900+gm->tm_year
        !            59:     ,hour,gm->tm_min,mer);
        !            60: return(str);
        !            61: }
        !            62: 
        !            63: /****************************************************************************/
        !            64: /* Converts unix time format (long - time_t) into a char str MM/DD/YY          */
        !            65: /****************************************************************************/
        !            66: char *unixtodstr(time_t unix, char *str)
        !            67: {
        !            68: 
        !            69: if(!unix)
        !            70:        strcpy(str,"00/00/00");
        !            71: else {
        !            72:        unixtodos(unix,&date,&curtime);
        !            73:        if((unsigned)date.da_mon>12) {    /* DOS leap year bug */
        !            74:                date.da_mon=1;
        !            75:                date.da_year++; }
        !            76:        if((unsigned)date.da_day>31)
        !            77:                date.da_day=1;
        !            78:        sprintf(str,"%02u/%02u/%02u",date.da_mon,date.da_day
        !            79:                ,date.da_year>=2000 ? date.da_year-2000 : date.da_year-1900); }
        !            80: return(str);
        !            81: }
        !            82: 
        !            83: 
        !            84: void long_bbs_info(FILE *out, bbs_t bbs)
        !            85: {
        !            86:        int i;
        !            87: 
        !            88: fprintf(out,"BBS Name: %s since %s\r\n"
        !            89:        ,bbs.name,unixtodstr(bbs.birth,tmp));
        !            90: fprintf(out,"Operator: ");
        !            91: for(i=0;i<bbs.total_sysops && i<MAX_SYSOPS;i++) {
        !            92:        if(i) {
        !            93:                if(bbs.total_sysops>2)
        !            94:                        fprintf(out,", ");
        !            95:                else
        !            96:                        fputc(SP,out);
        !            97:                if(!(i%4))
        !            98:                        fprintf(out,"\r\n          ");
        !            99:                if(i+1==bbs.total_sysops)
        !           100:                        fprintf(out,"and "); }
        !           101:        fprintf(out,"%s",bbs.sysop[i]); }
        !           102: fprintf(out,"\r\n");
        !           103: fprintf(out,"Software: %-15.15s Nodes: %-5u "
        !           104:        "Users: %-5u Doors: %u\r\n"
        !           105:        ,bbs.software,bbs.nodes,bbs.users,bbs.xtrns);
        !           106: fprintf(out,"Download: %lu files in %u directories of "
        !           107:        "%luMB total space\r\n"
        !           108:        ,bbs.files,bbs.dirs,bbs.megs);
        !           109: fprintf(out,"Messages: %lu messages in %u sub-boards\r\n"
        !           110:        ,bbs.msgs,bbs.subs);
        !           111: fprintf(out,"Networks: ");
        !           112: for(i=0;i<bbs.total_networks && i<MAX_NETS;i++) {
        !           113:        if(i) {
        !           114:                if(bbs.total_networks>2)
        !           115:                        fprintf(out,", ");
        !           116:                else
        !           117:                        fputc(SP,out);
        !           118:                if(!(i%3))
        !           119:                        fprintf(out,"\r\n          ");
        !           120:                if(i+1==bbs.total_networks)
        !           121:                        fprintf(out,"and "); }
        !           122:        fprintf(out,"%s [%s]",bbs.network[i],bbs.address[i]); }
        !           123: fprintf(out,"\r\n");
        !           124: fprintf(out,"Terminal: ");
        !           125: for(i=0;i<bbs.total_terminals && i<MAX_TERMS;i++) {
        !           126:        if(i) {
        !           127:                if(bbs.total_terminals>2)
        !           128:                        fprintf(out,", ");
        !           129:                else
        !           130:                        fputc(SP,out);
        !           131:                if(i+1==bbs.total_terminals)
        !           132:                        fprintf(out,"and "); }
        !           133:        fprintf(out,"%s",bbs.terminal[i]); }
        !           134: fprintf(out,"\r\n\r\n");
        !           135: for(i=0;i<bbs.total_numbers && i<MAX_NUMBERS;i++)
        !           136:        fprintf(out,"%-30.30s %12.12s %5u %-15.15s "
        !           137:                "Minimum: %u\r\n"
        !           138:                ,i && !strcmp(bbs.number[i].location,bbs.number[i-1].location)
        !           139:                        ? nulstr : bbs.number[i].location
        !           140:                ,bbs.number[i].number
        !           141:                ,bbs.number[i].max_rate,bbs.number[i].modem
        !           142:                ,bbs.number[i].min_rate);
        !           143: 
        !           144: fprintf(out,"\r\n");
        !           145: for(i=0;i<5;i++) {
        !           146:        if(!bbs.desc[i][0])
        !           147:                break;
        !           148:        fprintf(out,"%15s%s\r\n",nulstr,bbs.desc[i]); }
        !           149: 
        !           150: fprintf(out,"\r\n");
        !           151: fprintf(out,"Entry created on %s by %s\r\n"
        !           152:        ,timestr(&bbs.created),bbs.user);
        !           153: if(bbs.updated && bbs.userupdated[0])
        !           154:        fprintf(out," Last updated on %s by %s\r\n"
        !           155:                ,timestr(&bbs.updated),bbs.userupdated);
        !           156: if(bbs.verified && bbs.userverified[0])
        !           157:        fprintf(out,"Last verified on %s by %s\r\n"
        !           158:         ,timestr(&bbs.verified),bbs.userverified);
        !           159: }
        !           160: 
        !           161: int main(int argc, char **argv)
        !           162: {
        !           163:        char str[128];
        !           164:        int i,j,file,ff;
        !           165:        FILE *in,*shrt,*lng;
        !           166:        bbs_t bbs;
        !           167:        sortstr_t **sortstr=NULL;
        !           168: 
        !           169: if((i=open("SBL.DAB",O_RDONLY|O_BINARY|O_DENYNONE))==-1) {
        !           170:        printf("error opening SBL.DAB\n");
        !           171:        return(1); }
        !           172: 
        !           173: if((in=fdopen(i,"rb"))==NULL) {
        !           174:        printf("error opening SBL.DAB\n");
        !           175:        return(1); }
        !           176: 
        !           177: if((shrt=fopen("SBBS.LST","wb"))==NULL) {
        !           178:        printf("error opening/creating SBBS.LST\n");
        !           179:        return(1); }
        !           180: 
        !           181: if((lng=fopen("SBBS_DET.LST","wb"))==NULL) {
        !           182:        printf("error opening/creating SBBS_DET.LST\n");
        !           183:        return(1); }
        !           184: 
        !           185: fprintf(shrt,"Synchronet BBS List exported from Vertrauen on %s\r\n"
        !           186:                         "======================================================="
        !           187:                         "\r\n\r\n"
        !           188:        ,unixtodstr(time(NULL),str));
        !           189: 
        !           190: fprintf(lng,"Detailed Synchronet BBS List exported from Vertrauen on %s\r\n"
        !           191:                        "================================================================"
        !           192:                        "\r\n\r\n"
        !           193:        ,unixtodstr(time(NULL),str));
        !           194: 
        !           195: printf("Sorting...");
        !           196: fseek(in,0L,SEEK_SET);
        !           197: i=j=0;
        !           198: while(1) {
        !           199:        if(!fread(&bbs,sizeof(bbs_t),1,in))
        !           200:                break;
        !           201:        j++;
        !           202:        printf("%4u\b\b\b\b",j);
        !           203:        if(!bbs.name[0] || strnicmp(bbs.software,"SYNCHRONET",10))
        !           204:                continue;
        !           205:        i++;
        !           206:        strcpy(str,bbs.number[0].number);
        !           207:        if((sortstr=(sortstr_t **)farrealloc(sortstr
        !           208:                ,sizeof(sortstr_t *)*i))==NULL) {
        !           209:                printf("\r\n\7Memory allocation error\r\n");
        !           210:                return(1); }
        !           211:        if((sortstr[i-1]=(sortstr_t *)farmalloc(sizeof(sortstr_t)
        !           212:                ))==NULL) {
        !           213:                printf("\r\n\7Memory allocation error\r\n");
        !           214:                return(1); }
        !           215:        strcpy(sortstr[i-1]->str,str);
        !           216:        sortstr[i-1]->offset=j-1; }
        !           217: 
        !           218: qsort((void *)sortstr,i,sizeof(sortstr[0])
        !           219:        ,(int(*)(const void *, const void *))sortstr_cmp);
        !           220: 
        !           221: printf("\nCreating index...");
        !           222: sprintf(str,"SBBSSORT.NDX");
        !           223: if((file=open(str,O_RDWR|O_CREAT|O_TRUNC|O_BINARY,S_IWRITE|S_IREAD))==-1) {
        !           224:        printf("\n\7Error creating %s\n",str);
        !           225:        return(1); }
        !           226: for(j=0;j<i;j++)
        !           227:        write(file,&sortstr[j]->offset,2);
        !           228: printf("\n");
        !           229: 
        !           230: lseek(file,0L,SEEK_SET);
        !           231: ff=0;
        !           232: while(1) {
        !           233:        if(read(file,&i,2)!=2)
        !           234:                break;
        !           235:        fseek(in,(long)i*sizeof(bbs_t),SEEK_SET);
        !           236:        if(!fread(&bbs,sizeof(bbs_t),1,in))
        !           237:                break;
        !           238:        long_bbs_info(lng,bbs);
        !           239:        if(ff)
        !           240:                fprintf(lng,"\x0c\r\n");
        !           241:        else
        !           242:                fprintf(lng,"\r\n---------------------------------------------"
        !           243:                        "----------------------------------\r\n\r\n");
        !           244:        ff=!ff;
        !           245:        for(i=0;i<bbs.total_numbers && i<MAX_NUMBERS;i++)
        !           246:                fprintf(shrt,"%-25.25s  %-30.30s  %12.12s  %u\r\n"
        !           247:                        ,i ? "" : bbs.name,bbs.number[i].location,bbs.number[i].number
        !           248:                        ,bbs.number[i].max_rate);
        !           249:        }
        !           250: }

unix.superglobalmegacorp.com

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