home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Shareware BBS: 2 BBS / 02-BBS.zip / mrl1.zip / link.c < prev    next >
C/C++ Source or Header  |  1997-06-20  |  4KB  |  187 lines

  1. #include <malloc.h>
  2. #include <stdio.h>
  3. #include <string.h>
  4. #include "mrl.h"
  5.  
  6. struct msgrec
  7. {
  8.  unsigned int n;
  9.  char *msgid;
  10.  char *reply;
  11.  unsigned int lprev;
  12.  unsigned int lnext;
  13.  struct msgrec *next;
  14. };
  15.  
  16. struct msgrec *fmsg=NULL; /* pointer to first message */
  17. struct msgrec *last=NULL; /* pointer to  last message */
  18.  
  19. /* lok. fce - hledani*/
  20. struct msgrec *FindbyMSGID(const char *msgid);
  21. struct msgrec *Findbyn(unsigned int n);
  22.  
  23. /* build msg list */
  24. int AddToList(unsigned int n, const char *mid, const char *rid);
  25. int BuildMsgList(const char *dir);
  26.  
  27. /* Linkovani */
  28. void LinkList(void); /* Zlinkuje list v pameti */
  29. int UpdateMsgList(const char *dir);
  30.  
  31. /* Kod zacina zde ! */
  32. int AddToList(unsigned int n, const char *mid, const char *rid)
  33. {
  34.  struct msgrec *b;
  35.  char *s;
  36.  if(!(b=malloc(sizeof(struct msgrec)))) return -1;
  37.                     
  38.  /* init */
  39.  b->n=n;
  40.  b->msgid=NULL;
  41.  b->reply=NULL;
  42.  b->next=NULL;
  43.  b->lprev=0;
  44.  b->lnext=0;
  45.  
  46.  if(strlen(mid))
  47.   {
  48.    if(!(s=malloc(strlen(mid)+1))){ 
  49.                    free(b);
  50.                    return -1;
  51.                 };
  52.    strcpy(s,mid);
  53.    b->msgid=s;
  54.   }
  55.  
  56.  if(strlen(rid))
  57.   {
  58.    if(!(s=malloc(strlen(rid)+1))){
  59.                     free(b->msgid);
  60.                     free(b);
  61.                     return -1;
  62.                   };
  63.    strcpy(s,rid);
  64.    b->reply=s;
  65.   }
  66.  
  67.   /* link b to list */
  68.   if(last) last->next=b;
  69.   else fmsg=b;
  70.   last=b;
  71.   return 0;
  72. }
  73.  
  74. int BuildMsgList(const char *dir)
  75. {
  76.  unsigned i;
  77.  char *tmp=malloc(280);
  78.  char *etmp=malloc(380);
  79.  char *mtmp=malloc(280);
  80.  char *rtmp=malloc(280);
  81.  if((!tmp)||(!mtmp)||(!rtmp)||(!etmp))
  82.   { WriteLog(logname," Malloc error in BuildMsgList",'!');return -1;}
  83.  for(i=mmin;i<=mmax;i++)
  84.  {
  85. /*printf("\n");*/
  86.   CreName(tmp,dir,i);
  87. /*printf("Trying: %s..",tmp);*/
  88.   if(GetMID(tmp,mtmp,rtmp)) continue;
  89. /*printf("OK");*/
  90. /*printf("\n%d %s==%s",i,mtmp,rtmp);*/
  91.   if(AddToList(i,mtmp,rtmp))
  92.     { WriteLog(logname," Malloc error in AddToList",'!');return -1;}
  93.  
  94.   if(SetLinks(tmp,0,0)) { sprintf(etmp," %s - Link reset error",tmp);
  95.                           WriteLog(logname,etmp,'!');
  96.                       perror(etmp); };
  97.  }
  98.  /* ted jeste pridame jeden prazdny zaznam na konec */
  99.  AddToList(65535,"","");
  100.  free(tmp);
  101.  free(mtmp);
  102.  free(rtmp);
  103.  free(etmp);
  104.  return 0;
  105. }
  106.  
  107. int UpdateMsgList(const char *dir)
  108. /* zmeni jen ty .MSG co se zlinkovaly */
  109. {
  110.  char *tmp=malloc(260);
  111.  char *etmp=malloc(360);
  112.  struct msgrec *i=fmsg;
  113.  if(!tmp) return -1;
  114.  while(i->next)
  115.  {
  116.   if((i->lprev)||(i->lnext))
  117.     {
  118.      CreName(tmp,dir,i->n);
  119.      if(SetLinks(tmp,i->lprev,i->lnext))
  120.       { sprintf(etmp,"Cannot update links in %s",tmp);
  121.         WriteLog(logname,etmp,'!');
  122.     perror(etmp);
  123.       }
  124. /*    else
  125.       printf("%s updated.\n",tmp); */
  126.     }
  127.   i=i->next;
  128.  }   
  129.  free(tmp);
  130.  free(etmp);
  131.  return 0;
  132. }
  133.  
  134. struct msgrec *Findbyn(unsigned int n)
  135. {
  136.   struct msgrec *i=fmsg;
  137.   while((i->n<=n)&&(i->next))
  138.     if(n==i->n) return i;
  139.     else
  140.      i=i->next;
  141.   WriteLog(logname," NULL returned by Findbyn",'!');
  142.   return NULL;
  143. }
  144.  
  145. struct msgrec *FindbyMSGID(const char *msgid)
  146. {
  147.   struct msgrec *i=fmsg;
  148.   while(i->next)
  149.   {
  150.     if (i->msgid)
  151.       if(!strcmp(msgid,i->msgid))
  152.         return i;
  153.     i=i->next;
  154.   }
  155.   return NULL;
  156. }
  157.  
  158.  
  159. void LinkList(void) /* Zlinkuje list v pameti */
  160. {
  161.  char *tmp=malloc(255);
  162.  struct msgrec *i,*j;
  163.  if(!tmp) WriteLog(logname,"Out of memory in LinkList, Linking aborted",'!');
  164.  for(i=fmsg;i->next;i=i->next) 
  165.  {
  166.  if(!(i->reply)) continue; /* neni to odpoved na neco */
  167.  if((j=FindbyMSGID(i->reply)))
  168.    {
  169.    i->lprev=j->n;
  170.    /* nasli jsme odpoved, prilinkujeme ji na konec */
  171.    for(;(j->lnext)&&(j->next);j=Findbyn(j->lnext)); /* najdi konec threadu */
  172.    j->lnext=i->n;
  173.    sprintf(tmp,"msg %hu linked to msg %hu",j->n,i->n);
  174.    WriteLog(logname,tmp,'*');
  175.    }
  176.  }
  177.  free(tmp);
  178. }
  179.  
  180. int Link(const char *dir)
  181. {
  182.  if(BuildMsgList(dir)) return -1;
  183.  LinkList();
  184.  if(UpdateMsgList(dir)) return -1;
  185.  return 0;
  186. }
  187.