home *** CD-ROM | disk | FTP | other *** search
/ PC Online 1998 September / PCO_0998.ISO / filesbbs / dos / sbbs_src.exe / SBBS / SBL / SBBSLIST.C < prev    next >
Encoding:
C/C++ Source or Header  |  1997-04-13  |  6.8 KB  |  251 lines

  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. }
  251.