home *** CD-ROM | disk | FTP | other *** search
/ ProfitPress Mega CDROM2 …eeware (MSDOS)(1992)(Eng) / ProfitPress-MegaCDROM2.B6I / BBS / MISC / HSRC_117.ZIP / POSTMESS.C < prev    next >
Encoding:
C/C++ Source or Header  |  1990-11-27  |  15.6 KB  |  559 lines

  1. #include <msgg.h>
  2. #include <twindow.h>
  3. #include <keys.h>
  4. #include "headedit.h"
  5. #include "headid.h"
  6.  
  7. extern word vbase;
  8. extern word maxx;
  9. extern word maxy;
  10. extern char current_color;
  11. extern word videomethod;
  12. extern WINDOW *ewnd;
  13.  
  14. extern long make_msgid (void);
  15.  
  16.  
  17. void pascal post_mess (char *fname) {
  18.  
  19.  char *p;
  20.  char message[133];
  21.  word lenmess;
  22.  struct date dos_date;
  23.  int handlem;
  24.  int handlet;
  25.  int handlef;
  26.  long mlen;
  27.  long tlen;
  28.  long flen;
  29.  struct ffblk f;
  30.  char level=0;
  31.  char temp;
  32.  struct _carbon *carbon[20]={NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,
  33.                              NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL};
  34.  char numcarbons=0;
  35.  WINDOW *carbwnd=NULL;
  36.  struct _bomb_addr *bomb_addr=NULL;
  37.  char lastnumcarbons=0;
  38.  
  39.  
  40. EditSomeMore:
  41.  
  42.  if (!*fname) {
  43.      strcpy(message,"MSGTMP");
  44.  }
  45.  else strcpy(message,fname);
  46.  *filename=0;
  47.  if ((currarea->attr & ANSI) && ansieditor) strcpy(filename,ansieditor);
  48.  else if (editor) strcpy(filename,editor);
  49.  if(*filename) {
  50.     do_spawn(filename);
  51.  }
  52.  else {
  53.     if(template) {
  54.         strcpy(filename,template);
  55.         do_spawn(filename);
  56.     }
  57.     strcpy(notefile,"MSGTMP");
  58.     notepad();
  59.  }
  60.  
  61.  if (findfirst(message,&f,0)) level=1;
  62.  else if (f.ff_fsize<3L) level=1;
  63.  
  64.  if (!level) {
  65. AskAgain:
  66.     set_help ("atpost    ",0,22);
  67.     show_header(0);
  68.     if(carbon) {
  69.  
  70.         int register x;
  71.  
  72.         if(lastnumcarbons!=numcarbons) {
  73.             if(carbwnd)    delete_window(carbwnd);
  74.             if((currarea->attr & NET) || (currarea->attr & ALTERNATE)) {
  75.                 carbwnd=establish_window(1,maxy-24,21,70);
  76.             }
  77.             else carbwnd=establish_window(1,maxy-24,21,40);
  78.             set_border(carbwnd,3);
  79.             set_title(carbwnd," Carbons ");
  80.             set_colors(carbwnd,BORDER,7,0,0);
  81.             display_window(carbwnd);
  82.             wcursor(carbwnd,0,0);
  83.             for(x=0;x<numcarbons;x++) {
  84.                 if((currarea->attr & NET) || (currarea->attr & ALTERNATE)) {
  85.                     wprintf(carbwnd," %-36s (%u:%u/%u.%u) %d\x9b",carbon[x]->name,carbon[x]->zone,carbon[x]->net,carbon[x]->node,carbon[x]->point);
  86.                 }
  87.                 else wprintf(carbwnd," %s",carbon[x]->name);
  88.                 if(x<numcarbons-1)wprintf(carbwnd,"\n");
  89.             }
  90.             lastnumcarbons=numcarbons;
  91.         }
  92.     }
  93.     if (msg.d_zone!=msg.o_zone && ((currarea->attr & NET) || (currarea->attr & ALTERNATE))) {
  94.         sprintf(filename," (%u:%u/%u): [S]ave, [A]bort, [C]arbons, [B]omb or [E]dit Header? [S] ",msg.d_zone,msg.dest_net,msg.dest);
  95.         any_message(filename);
  96.     }
  97.     else if(msg.d_zone==msg.o_zone && msg.dest==msg.orig && msg.dest_net==msg.orig_net && msg.d_point==msg.o_point && ((currarea->attr & NET) || (currarea->attr & ALTERNATE))) {
  98.         any_message(" (Misaddressed?) [S]ave, [A]bort, [C]arbons, [B]omb or [E]dit Header? [S] ");
  99.     }
  100.     else if((currarea->attr & NET) || (currarea->attr & ALTERNATE)) {
  101.         any_message("[S]ave, [A]bort, [C]arbons, [B]omb or [E]dit Header? [S] ");
  102.     }
  103.     else if(!(currarea->attr & ECHO) && !(currarea->attr & ALTECHO)) {
  104.         any_message(" [S]ave, [A]bort, [C]arbons or [E]dit Header? [S] ");
  105.     }
  106.     else any_message(" [S]ave, [A]bort, or [E]dit Header? [S] ");
  107.     temp=toupper(generic_mouse_input(ewnd));
  108.     switch ((int)temp) {
  109.         case CTRL_R: clear_message();
  110.                      goto EditSomeMore;
  111.         case ALT_O:  get_origin();
  112.                      goto AskAgain;
  113.         case CTRL_O: usedefault=1-usedefault;
  114.                      if(usedefault) any_message(" Always using default origin line");
  115.                      else any_message(" Looking up origin lines in ORIGINS.BBS ");
  116.                      pause();
  117.                      goto AskAgain;
  118.         case CTRL_W: wrapit=1-wrapit;
  119.                      if(wrapit || !wrapcall) _anymsg(" Toggled Wrapping "," OFF ");
  120.                      else _anymsg(" Toggled Wrapping "," ON ");
  121.                      pause();
  122.                      goto AskAgain;
  123.         case 13:
  124.         case 'S':    break;
  125.         case 'A':    level=1;
  126.                     get_rid();
  127.                     if(carbwnd)delete_window(carbwnd);
  128.                     if(numcarbons) {
  129.  
  130.                         int register x;
  131.  
  132.                         for(x=0;x<numcarbons;x++) if(carbon[x])free(carbon[x]);
  133.                     }
  134.                     if(bomb_addr)free(bomb_addr);
  135.                     return;
  136.         case 'E':   clear_message();
  137.                     edit_mess(2);
  138.                     goto AskAgain;
  139.         case 'C':   if((currarea->attr & ECHO) || (currarea->attr & ALTECHO)) goto AskAgain;
  140.                     if(numcarbons>18) {
  141.                         error_message(" Max # of carbons in use--Delete one ");
  142.                         nopause();
  143.                         goto AskAgain;
  144.                     }
  145.                     carbon[numcarbons]=(struct _carbon *)malloc(sizeof(struct _carbon));
  146.                     if(!carbon[numcarbons]) {
  147.                         error_message(" Insufficient memory for carbon ");
  148.                         pause();
  149.                         goto AskAgain;
  150.                     }
  151.                     if(!fill_in_carbon(carbon[numcarbons])) {
  152.                         free(carbon[numcarbons]);
  153.                     }
  154.                     else numcarbons++;
  155.                     goto AskAgain;
  156.         case 'D':    if(!numcarbons) goto AskAgain;
  157.                     else {
  158.  
  159.                         int x;
  160.                         int y;
  161.  
  162.                         any_message(" Select carbon.  [Enter] deletes, ESC aborts ");
  163.                         sleep(1);
  164.                         set_help("delcarbon ",0,23);
  165.                         clear_message();
  166.                         x=get_selection(carbwnd,numcarbons,NULL);
  167.                         if(x && x<numcarbons+1) {
  168.                             for(y=(x-1);y<numcarbons;y++) {
  169.                                 memcpy(carbon[y],carbon[y+1],sizeof(struct _carbon));
  170.                             }
  171.                             if(carbon[numcarbons-1])free(carbon[numcarbons-1]);
  172.                             numcarbons--;
  173.                         }
  174.                     }
  175.                     set_help ("atpost    ",0,23);
  176.                     goto AskAgain;
  177.         case 'B':    if((!(currarea->attr & NET) && !(currarea->attr & ALTERNATE)) || !nidxsize || numcarbons) goto AskAgain;
  178.                     bomb_addr=(struct _bomb_addr *)malloc(sizeof(struct _bomb_addr *));
  179.                     if(!bomb_addr) {
  180.                         error_message(" Insufficient memory for bomb run ");
  181.                         pause();
  182.                         goto AskAgain;
  183.                     }
  184.                     if(!bomb_who(bomb_addr)) {
  185.                         free(bomb_addr);
  186.                         bomb_addr=NULL;
  187.                         goto AskAgain;
  188.                     }
  189.                     break;
  190.         default:    goto AskAgain;
  191.     }
  192.  }
  193.  clear_message();
  194.  if(carbwnd) delete_window(carbwnd);
  195.  if (level) {
  196.     if (editor) {
  197.         any_message(" Aborted--Any Key ");
  198.         pause();
  199.     }
  200.     get_rid();
  201.     if(numcarbons) {
  202.  
  203.         int register x;
  204.  
  205.         for(x=0;x<numcarbons;x++) if(carbon[x])free(carbon[x]);
  206.     }
  207.     if(bomb_addr)free(bomb_addr);
  208.     return;
  209.  }
  210.  if (wrapcall && !wrapit && editor && !(currarea->attr & ANSI)) {
  211.     do_spawn(wrapcall);
  212.  }
  213.  sprintf(filename,"%sXDATA.%03x",path,areano);
  214.  sprintf(textname,"%sXTEXT.%03x",path,areano);
  215.  
  216. AccessLoop1:
  217.   if (findfirst(filename,&f,0)) flen=0;
  218.   else flen=f.ff_fsize;
  219.   if ((handlef=_open(filename,O_RDWR | O_BINARY | O_DENYNONE))==-1) {
  220.         if (errno==EACCES) {
  221.             any_message(" Awaiting access... ");
  222.             goto AccessLoop1;
  223.         }
  224.         if((handlef=creat(filename,S_IWRITE))==-1) {
  225.             error_message(" Can't open message base ");
  226.             pause();
  227.             get_rid();
  228.             if(numcarbons) {
  229.  
  230.                 int register x;
  231.  
  232.                 for(x=0;x<numcarbons;x++) if(carbon[x])free(carbon[x]);
  233.             }
  234.             if(bomb_addr)free(bomb_addr);
  235.             return;
  236.         }
  237.   }
  238.   clear_message();
  239.   lock(handlef,flen,(long)sizeof(struct _xmsg));
  240.   lseek(handlef,0L,SEEK_END);
  241.  
  242. AccessLoop:
  243.   if (findfirst(textname,&f,0))tlen=0;
  244.   else tlen=f.ff_fsize;
  245.   if ((handlet=_open(textname,O_RDWR | O_BINARY | O_DENYNONE))==-1) {
  246.     if (errno==EACCES) {
  247.         any_message(" Awaiting access... ");
  248.         goto AccessLoop;
  249.     }
  250.     if((handlet=creat(textname,S_IWRITE))==-1) {
  251.         error_message(" Can't open message files ");
  252.         _close(handlef);
  253.         pause();
  254.         get_rid();
  255.         if(numcarbons) {
  256.  
  257.             int register x;
  258.  
  259.             for(x=0;x<numcarbons;x++) if(carbon[x])free(carbon[x]);
  260.         }
  261.         if(bomb_addr)free(bomb_addr);
  262.         return;
  263.       }
  264.   }
  265.   clear_message();
  266.   lock(handlet,tlen,65535L);
  267.   lseek(handlet,0L,SEEK_END);
  268.  
  269.  lenmess=0;
  270.  
  271.  if (!*fname) {
  272.      strcpy(message,"MSGTMP");
  273.  }
  274.  else strcpy(message,fname);
  275.  
  276.  if (findfirst(message,&f,0)) mlen=0;
  277.  else mlen=f.ff_fsize;
  278.  if ((handlem=_open(message,O_RDONLY | O_BINARY | O_DENYNONE))==-1) {
  279.    error_message(" Read error...lost ");
  280.    _close(handlef);
  281.    _close(handlet);
  282.    pause();
  283.    if(numcarbons) {
  284.  
  285.       int register x;
  286.  
  287.        for(x=0;x<numcarbons;x++) if(carbon[x])free(carbon[x]);
  288.    }
  289.    if(bomb_addr)free(bomb_addr);
  290.    return;
  291.  }
  292.  lock(handlem,0,mlen);
  293.  msg.start=tell(handlet);
  294.  lenmess=0;
  295.  
  296.  if ((currarea->attr & NET) || (currarea->attr & ALTERNATE)) {
  297.  
  298.     char mydomain[37];
  299.     char yourdomain[37];
  300.  
  301.     if (msg.o_point && !nopt)
  302.         lenmess+=ffprintf(handlet,"\01FMPT %01u\r",msg.o_point);
  303.  
  304.     strcpy(mydomain,curaddress.domain);
  305.     strcpy(yourdomain,to_domain);
  306.  
  307.     if(msg.d_point && !nopt) lenmess+=ffprintf(handlet,"\01TOPT %01u\r",msg.d_point);
  308.  
  309.     if (msg.o_zone!=msg.d_zone && msg.d_zone && msg.o_zone && !nointl)
  310.         lenmess+=ffprintf(handlet,"\01INTL %u:%u/%u %u:%u/%u\r",msg.d_zone,msg.dest_net,msg.dest,msg.o_zone,msg.orig_net,msg.orig);
  311.  
  312.     if(stricmp(mydomain,yourdomain) && !nointl)
  313.         lenmess+=ffprintf(handlet,"\01DOMAIN %s %u:%u/%u.%u %s %u:%u/%u.%u\r",yourdomain,msg.d_zone,msg.dest_net,msg.dest,msg.d_point,mydomain,msg.o_zone,msg.orig_net,msg.orig,msg.o_point);
  314.  }
  315.  
  316.  lenmess+=ffprintf(handlet,"\01MSGID: %u:%u/%u.%01u@%s %lx\r",msg.o_zone,msg.orig_net,msg.orig,msg.o_point,curaddress.domain,make_msgid());
  317.  if(*replyid) {
  318.     lenmess+=ffprintf(handlet,"\01REPLY: %s\r",replyid);
  319.     *replyid=0;
  320.  }
  321.  
  322.  if (((currarea->attr & NET) || (currarea->attr & ALTERNATE)) && !numcarbons && !bomb_addr) {
  323.     lenmess+=ffprintf(handlet,"\01MSGTO: %u:%u/%u.%01u@%s\r",msg.d_zone,msg.dest_net,msg.dest,msg.d_point,to_domain);
  324.  }
  325.  
  326.  if(((currarea->attr & ECHO) || (currarea->attr & ALTECHO)) && (currarea->attr & NOORIG)) {
  327.     lenmess+=ffprintf(handlet,"\01PID: %s\r",PID_ID);
  328.  }
  329.  
  330.  if(*assocfile && (currarea->attr & ASSOC)) lenmess+=ffprintf(handlet,"\01ASSOC: %s\r",assocfile);
  331.  *assocfile=0;
  332.  
  333.  while(!eof(handlem)) {
  334.    if (!fgetsx(message,81,handlem)) break;
  335.    while (p=strstr(message,"\r\n")) memmove(&p[1],&p[2],strlen(&p[2])+1);
  336.    while (p=strchr(message,'\n')) *p='\r';
  337.    while (p=strstr(message," \x8d")) memmove(&p[1],&p[2],strlen(&p[2])+1);
  338.    while (p=strchr(message,'\x8d')) *p=' ';
  339.    while (p=strchr(message,'\x1a')) memmove(p,&p[1],strlen(&p[1])+1);
  340.    lenmess+=strlen(message);
  341.    ffprintf(handlet,"%s",message);
  342.    if(lenmess>65100) break;
  343.  }
  344.  unlock(handlem,0,mlen);
  345.  _close(handlem);
  346.  msg.m_attr |= MSGTREATED;
  347.  
  348.  if(currarea->attr & ANSI) lenmess+=ffprintf(handlet,"\x1b[23;1H\r\n");
  349.  
  350.  if (((currarea->attr & ECHO) || (currarea->attr & ALTECHO)) && !(currarea->attr & NOORIG)) {
  351.    if(!usedefault) {
  352.  
  353.        char noorigin=0;
  354.        char notear=0;
  355.  
  356.        sprintf(message,"%sORIGINS.BBS",path);
  357.        if((handlem=_open(message,O_RDONLY | O_TEXT | O_DENYNONE))==-1) {
  358.             goto SkipOrigins;
  359.        }
  360.        while (!eof(handlem) && (word)atol(message)!=currarea->number) {
  361.           if(!fgetsx(message,81,handlem)) break;
  362.           message[66]=0;
  363.           stripcr(message);
  364.        }
  365.        _close(handlem);
  366.        if ((word)atol(message)!=currarea->number) {
  367.             goto SkipOrigins;
  368.        }
  369.        strtok(message,"; ");
  370.        stripcr(message);
  371.        if(!strcmp(message,"NOORIGIN")) {
  372.             noorigin++;
  373.        }
  374.        else if (!strncmp(message,"NOTEAR",6)) {
  375.             notear++;
  376.             strtok(0," ");    /* Rest is origin */
  377.        }
  378.        else if (!strcmp(message,"NOORIGIN/NOTEAR")) {
  379.             notear++;
  380.             noorigin++;
  381.        }
  382.        if(!notear) {
  383.             lenmess+=ffprintf(handlet,"%s",HEADID);
  384.        }
  385.        if(!noorigin) {
  386.            if(msg.o_point)lenmess+=(ffprintf(handlet,"%s%s (%u:%u/%u.%01u)\r",ORIGTXT,strtok(0,"\n"),msg.o_zone,msg.orig_net,msg.orig,msg.o_point));
  387.            else lenmess+=(ffprintf(handlet,"%s%s (%u:%u/%u)\r",ORIGTXT,strtok(0,"\n"),msg.o_zone,msg.orig_net,msg.orig));
  388.        }
  389.        if(noorigin) {
  390.             ffprintf(handlet,"\r");
  391.             lenmess++;
  392.        }
  393.        goto GotOrigin;
  394.    }
  395. SkipOrigins:
  396.    if(msg.o_point)lenmess+=(ffprintf(handlet,"%s%s%s (%u:%u/%u.%01u)\r",HEADID,ORIGTXT,origin,msg.o_zone,msg.orig_net,msg.orig,msg.o_point));
  397.    else lenmess+=(ffprintf(handlet,"%s%s%s (%u:%u/%u)\r",HEADID,ORIGTXT,origin,msg.o_zone,msg.orig_net,msg.orig));
  398.  }
  399.  else {
  400.     ffprintf(handlet,"\r");
  401.     lenmess++;
  402.  }
  403.  
  404. GotOrigin:
  405.  
  406.  if(numcarbons) {   /* Add carbons to end */
  407.  
  408.     int register x;
  409.  
  410.     lenmess+=ffprintf(handlet,"Original: %s\r",msg.to);
  411.     for(x=0;x<numcarbons;x++) {
  412.         lenmess+=ffprintf(handlet,"CC:       %s\r",carbon[x]->name);
  413.     }
  414.  }
  415.  
  416.    _write(handlet,"\0",1);
  417.    msg.length=lenmess+2;
  418.    unlock(handlet,tlen,65535L);
  419.    strcpy(msg.date,fidodate());
  420.    getdate(&dos_date);
  421.    msg.indate[0]=dos_date.da_year-1989;
  422.    msg.indate[1]=dos_date.da_mon;
  423.    msg.indate[2]=dos_date.da_day;
  424.    msg.indate[3]=0;
  425.    msg.times=0;
  426.  
  427.    if((currarea->attr & COMPRESS) && msg.length>packsize) {
  428.  
  429.         char *hold;
  430.  
  431.         hold=(char *)malloc(msg.length+1);
  432.         if(!hold) {
  433.             error_message(" Can't malloc memory to compress ");
  434.             pause();
  435.         }
  436.         else {
  437.             lseek(handlet,msg.start,SEEK_SET);
  438.             if(_read(handlet,hold,msg.length)<(msg.length-1)) {
  439.                 error_message(" Can't compress ");
  440.                 pause();
  441.             }
  442.             else {
  443.                 hold[msg.length-1]=0;
  444.                 hold[msg.length]=0;
  445.                 if(strlen(hold)>packsize) {
  446.                     hold=pack_msg(hold);
  447.                     if(!hold) {
  448.                        error_message(" Compression failed ");
  449.                        pause();
  450.                     }
  451.                     else {
  452.                         lseek(handlet,msg.start,SEEK_SET);
  453.                         msg.m_attr = msg.m_attr | MSGPACKED;
  454.                         _write(handlet,hold,msg.length);
  455.                         free(hold);
  456.                     }
  457.                 }
  458.                 else {
  459.                     free(hold);
  460.                 }
  461.             }
  462.        }
  463.    }
  464.  
  465.    _close(handlet);
  466.  
  467.    if(bomb_addr) {
  468.  
  469.         long x;
  470.  
  471.         for (x=0;x<(nidxsize+1);x++) {
  472.             if (nidx[x].zone==bomb_addr->zone && nidx[x].net==bomb_addr->net) break;
  473.         }
  474.         if(x>nidxsize) {
  475.             error_message(" Lost it in the sun... ");
  476.             pause();
  477.             goto AfterBomb;
  478.         }
  479.         unlock(handlef,flen,(long)sizeof(struct _xmsg));
  480.         while(x<nidxsize && nidx[x].zone==bomb_addr->zone && nidx[x].net==bomb_addr->net) {
  481.             sprintf(message," Bombing %u:%u/%u... ",nidx[x].zone,nidx[x].net,nidx[x].node);
  482.             any_message(message);
  483.             msg.dest=nidx[x].node;
  484.             msg.dest_net=nidx[x].net;
  485.             msg.d_zone=nidx[x].zone;
  486.             lseek(handlef,0L,SEEK_END);
  487.             flen=tell(handlef);
  488.             lock(handlef,flen,(long)sizeof(struct _xmsg));
  489.             _write(handlef,&msg,sizeof(struct _xmsg));
  490.             unlock(handlef,flen,(long)sizeof(struct _xmsg));
  491.             x++;
  492.         }
  493.         clear_message();
  494.         goto AfterBomb;
  495.    }
  496.  
  497.    lseek(handlef,0L,SEEK_END);
  498.    _write(handlef,&msg,sizeof(struct _xmsg));
  499.    unlock(handlef,flen,(long)sizeof(struct _xmsg));
  500.    if (!findfirst(filename,&f,0)) {
  501.        if ((word)(f.ff_fsize/(long)sizeof(struct _xmsg)) > currarea->max) {
  502.  
  503.             struct _xmsg msgtwo;
  504.             long pos;
  505.  
  506.          lseek(handlef,(f.ff_fsize-((long)(currarea->max)-1L)*(long)sizeof(struct _xmsg)),SEEK_SET);
  507.          pos=tell(handlef);
  508.          if (_read(handlef,&msgtwo,sizeof(struct _xmsg))>1) {
  509.              if (!(msgtwo.m_attr & MSGKEEP)) {
  510.                  msgtwo.m_attr = msgtwo.m_attr & (~MSGDELETED);
  511.                  lseek(handlef,pos,SEEK_SET);
  512.                  _write(handlef,&msgtwo,sizeof(struct _xmsg));
  513.              }
  514.          }
  515.        }
  516.    }
  517.    if(numcarbons) {
  518.  
  519.         int register x;
  520.  
  521.         for(x=0;x<numcarbons;x++) {
  522.             lseek(handlef,0L,SEEK_END);
  523.             flen=tell(handlef);
  524.             lock(handlef,flen,(long)sizeof(struct _xmsg));
  525.             strcpy(msg.to,carbon[x]->name);
  526.             if((currarea->attr & NET) || (currarea->attr & ALTERNATE)) {
  527.                 strcpy(msg.to,carbon[x]->name);
  528.                 msg.d_zone=carbon[x]->zone;
  529.                 msg.d_point=carbon[x]->point;
  530.                 msg.dest=carbon[x]->node;
  531.                 msg.dest_net=carbon[x]->net;
  532.                 msg.cost=carbon[x]->cost;
  533.                 sprintf(message," CC: %s (%u:%u/%u.%u)",carbon[x]->name,carbon[x]->zone,carbon[x]->net,carbon[x]->node,carbon[x]->point);
  534.             }
  535.             else {
  536.                 sprintf(message," CC: %s ",carbon[x]->name);
  537.             }
  538.             any_message(message);
  539.             _write(handlef,&msg,sizeof(struct _xmsg));
  540.             unlock(handlef,flen,(long)sizeof(struct _xmsg));
  541.         }
  542.         clear_message();
  543.    }
  544. AfterBomb:
  545.    _close(handlef);
  546.    nomess=check_area(areano);
  547.    messno=nomess;
  548.    get_rid();
  549.    posts++;
  550.  
  551.    if(numcarbons) {
  552.  
  553.       int register x;
  554.  
  555.        for(x=0;x<numcarbons;x++) if(carbon[x])free(carbon[x]);
  556.    }
  557.    if(bomb_addr)free(bomb_addr);
  558. }
  559.