home *** CD-ROM | disk | FTP | other *** search
/ Black Box 4 / BlackBox.cdr / progc / xdev_118.arj / XPORT.C < prev    next >
Text File  |  1990-07-17  |  6KB  |  265 lines

  1. #include "msg.h"
  2.  
  3. int export (char *,word,word,char *,char,char,char *);
  4. void leftt (char *,char *,int);
  5.  
  6. word     textsize;
  7. word     codesize;
  8.  
  9. int main (int argc,char *argv[]) {
  10.  
  11.     if (argc<7) {
  12.         fputs("\nError calling Xport.\n",stdout);
  13.         fputs("\nUsage: Xport <directory\\> <base#> <msg#> <filename> <net> <width> <MSG>\n",stdout);
  14.         fputs("\nIf MSG is passed as the final argument, the resulting exported file will",stdout);
  15.         fputs("\nbe in Fido/Opus *.MSG format\n",stdout);
  16.         exit(0);
  17.     }
  18.     export(argv[1],(word)atol(argv[2]),(word)atol(argv[3]),argv[4],(char)atol(argv[5]),(char)atol(argv[6]),strupr(argv[7]));
  19.     fputs("\nSuccess.\n",stdout);
  20.     return 0;
  21. }
  22.  
  23.  
  24. int export (dir,base,messno,file,net,width,msgflag)
  25.  
  26.  char *dir;
  27.  word base;
  28.  word messno;
  29.  char *file;
  30.  char net;
  31.  char width;
  32.  char *msgflag;
  33.  
  34. {
  35.  
  36.  char filename[127];
  37.  char textname[127];
  38.  char text[124];
  39.  FILE *fp;
  40.  FILE *pf;
  41.  FILE *pp;
  42.  word temp;
  43.  char once;
  44.  char message[81];
  45.  struct _xmsg msg2;
  46.  char *hold;
  47.  char *tempo;
  48.  word count;
  49.  word count2;
  50.  struct ffblk filestat;
  51.  struct _xmsg msg;
  52.  
  53.  sprintf(filename,"%sXDATA.%03x",dir,base);
  54.  sprintf(textname,"%sXTEXT.%03x",dir,base);
  55.  
  56.  if (findfirst(file,&filestat,0)==0) {
  57.     fputs("\n",stdout);
  58.     fputs(file,stdout);
  59.     fputs(" exists...aborting...\n",stdout);
  60.     exit(5);
  61.  }
  62.  if (findfirst(filename,&filestat,0)!=0) {
  63.     fputs("\nCannot find ",stdout);
  64.     fputs(filename,stdout);
  65.     exit (1);
  66.  }
  67.  if ((long)((messno-1) * sizeof(struct _xmsg))>=filestat.ff_fsize) {
  68.     fputs("\nMessage requested does not exist.\n",stdout);
  69.     exit (1);
  70.  }
  71.  if(!(pf=fopen(textname,"rb"))) {
  72.     fputs("\nCannot open ",stdout);
  73.     fputs(textname,stdout);
  74.     exit (1);
  75.  }
  76.       if(!(fp=fopen(filename,"rb"))) {
  77.             fclose(pf);
  78.             fputs("\nCannot open ",stdout);
  79.             fputs(filename,stdout);
  80.            exit(1);
  81.       }
  82.       if(strcmp(msgflag,"MSG")) pp=fopen(file,"wt");
  83.       else pp=fopen(file,"wb");
  84.       if(!pp) {
  85.            fclose (fp);
  86.            fclose (pf);
  87.            fputs("\nCannot open ",stdout);
  88.            fputs(file,stdout);
  89.            exit(1);
  90.       }
  91.  
  92.  if ((fseek(fp,(long)((long)(messno-1)*(long)sizeof(struct _xmsg)),SEEK_SET)!=0) || (fread(&msg,sizeof(struct _xmsg),1,fp)!=1)) {
  93.     if (ferror(fp)) perror ("\nXDATA SEEK ERROR");
  94.     fclose(fp);
  95.     fclose(pf);
  96.     fclose(pp);
  97.     remove(file);
  98.     exit (2);
  99.  }
  100.  
  101. Over:
  102.  if (strcmp(msgflag,"MSG")) {
  103.      sprintf(text,"Board #%u  *  Message #%u: ",base,messno);
  104.      fputs(text,pp);
  105.      if ((msg.attr & MSGPRIVATE)!=0) fputs("(Private)",pp);
  106.      if ((msg.m_attr & MSGDELETED)!=0) fputs("(Deleted)",pp);
  107.      if ((msg.attr & MSGCRASH)!=0) fputs("(CRASH)",pp);
  108.      if ((msg.attr & MSGKILL)!=0) fputs("(Kill)",pp);
  109.      if ((msg.attr & MSGSENT)!=0) fputs("(Sent)",pp);
  110.      if ((msg.attr & MSGFWD)!=0) fputs("(Fwd)",pp);
  111.      if ((msg.attr & MSGREAD)!=0) fputs("(Rec'd)",pp);
  112.      if ((msg.attr & MSGRRQ)!=0) fputs("(Rec.Req)",pp);
  113.      if ((msg.attr & MSGCPT)!=0) fputs("(Recpt)",pp);
  114.      if ((msg.attr & MSGARQ)!=0) fputs("(Aud.Req)",pp);
  115.      if ((msg.attr & MSGURQ)!=0) fputs("(Update Req)",pp);
  116.      sprintf(text,"(Read %u times)\n",msg.times);
  117.      fputs(text,pp);
  118.  
  119.      sprintf(text,"To:   %s",msg.to);
  120.      fputs(text,pp);
  121.      if ((net)!=0) {
  122.         sprintf(text," (%d/%d)",msg.dest_net,msg.dest);
  123.         fputs(text,pp);
  124.      }
  125.      fputs("\nFrom: ",pp);
  126.      if ((msg.m_attr & MSGANON)!=0) {
  127.        fputs("*Anonymous* (",pp);
  128.        fputs(msg.from,pp);
  129.        fputs(")",pp);
  130.      }
  131.      else fputs(msg.from,pp);
  132.      if (net) {
  133.         sprintf(text," (%d/%d)",msg.orig_net,msg.orig);
  134.         fputs(text,pp);
  135.      }
  136.      fputs("\nOn:   ",pp);
  137.  
  138.      if ((msg.m_attr & MSGANON)!=0) {
  139.        leftt(text,msg.date,9);
  140.        fputs(text,pp);
  141.      }
  142.      else fputs(msg.date,pp);
  143.      fputs("\n",pp);
  144.  
  145.      if ((msg.attr & MSGFILE)!=0) fputs("File: ",pp);
  146.      else if ((msg.attr & MSGFRQ)!=0) fputs("FReq: ",pp);
  147.      else fputs("Subj: ",pp);
  148.      fputs(msg.subj,pp);
  149.      fputs("\n\n",pp);
  150.  }
  151.  else fwrite(&msg,sizeof(struct _xmsg),1,pp);
  152.       once=0;
  153. TryThatOver:
  154.       if (fseek(pf,msg.start,SEEK_SET)!=0) {
  155.           if (ferror(pf)) {
  156.             if (!once) {
  157.                 once++;
  158.                 goto TryThatOver;
  159.             }
  160.             else {
  161.                 perror ("\nXTEXT SEEK ERROR");
  162.                 fclose(fp);
  163.                 fclose(pf);
  164.                 fclose(pp);
  165.                 exit(3);
  166.             }
  167.           }
  168.       }
  169.       hold=(char *)malloc(msg.length+1);
  170.       if (hold==NULL) {
  171.         fputs("\nOut of memory.\n",stdout);
  172.         fclose(pf);
  173.         fclose(fp);
  174.         fclose(pp);
  175.         exit (4);
  176.       }
  177.       fread(hold,msg.length,1,pf);
  178.       if(msg.m_attr & MSGPACKED) {
  179.             unpack_msg(&hold);
  180.             if(hold==NULL) {
  181.                 fputs("\nCan't uncompress message...\n",stdout);
  182.                 exit(9);
  183.             }
  184.             else {
  185.                 msg.length=strlen(hold)+1;
  186.             }
  187.       }
  188.       hold[msg.length-1]=0;
  189.  
  190.       while (strchr(hold,'\x8d')) {
  191.         tempo=strchr(hold,'\x8d');
  192.         memmove(tempo,&tempo[1],strlen(&tempo[1])+1);
  193.       }
  194.       tempo=hold;
  195.       count=0;
  196.       temp=strlen(hold);
  197.  
  198.   if (strcmp(msgflag,"MSG")) {
  199.       while (count<temp) {
  200.           count2=(word)(width-1);
  201.           if ((count+count2)>temp) count2=temp-count;
  202.           strncpy(message,&hold[count],count2);
  203.           message[count2 + 1]=0;
  204.           tempo=strchr(message,'\r');
  205.           if (tempo!=NULL) tempo[0]=0;
  206.           else {
  207.                 tempo=strrchr(message,' ');
  208.                 if (tempo!=NULL) tempo[0]=0;
  209.                 else message[count2]=0;
  210.           }
  211.           count=count+strlen(message)+1;
  212.           fprintf(pp,"%s\n",message);
  213.        }
  214.        fputc('\x1a',pp);
  215.   }
  216.   else {
  217.     fwrite(hold,strlen(hold),1,pp);
  218.     fputc('\0',pp);
  219.   }
  220.        free(hold);
  221.        fclose(pp);
  222.        fclose(pf);
  223.        fclose(fp);
  224.        return 0;
  225. }
  226.  
  227.  
  228. void leftt(a,b,x)
  229.  
  230. char *a,*b;
  231. int x;
  232.  
  233. {
  234.  
  235.   int i=0;
  236.  
  237.   x = (x <= strlen(b)) ? x : strlen(b);
  238.  
  239.   while (i++ < x) *a++ = *b++;
  240.  
  241.     *a = '\0';
  242.  
  243. }
  244.  
  245.  
  246. char * pascal rstrip (char *a) {
  247.  
  248.   register int x;
  249.  
  250.   x=strlen(a);
  251.   while (x && a && a[x-1]==' ') a[--x]=0;
  252.   return a;
  253. }
  254.  
  255.  
  256.  
  257. char * pascal lstrip (char *a) {
  258.  
  259.   register int x;
  260.  
  261.   x=strlen(a);
  262.   while (x && *a==' ') memmove (a,(a+1),x--);
  263.   return (a);
  264. }
  265.