home *** CD-ROM | disk | FTP | other *** search
/ BCI NET 2 / BCI NET 2.iso / archives / programming / c / c2man-2.0pl33.lha / c2man-2.0 / amiga / sortad.c < prev    next >
Encoding:
C/C++ Source or Header  |  1995-01-23  |  6.2 KB  |  267 lines

  1. /*
  2. ** $PROJECT:
  3. **
  4. ** $VER: sortad.c 2.1 (22.01.95)
  5. **
  6. ** by
  7. **
  8. ** Stefan Ruppert , Windthorststraße 5 , 65439 Flörsheim , GERMANY
  9. **
  10. ** (C) Copyright 1995
  11. ** All Rights Reserved !
  12. **
  13. ** $HISTORY:
  14. **
  15. ** 22.01.95 : 002.001 : initial
  16. */
  17.  
  18. /* ------------------------- version definitions -------------------------- */
  19.  
  20. /*FS*/ /* $STARTDEFINE: "BumpRev defines"*/
  21. #define VERSION  2
  22. #define REVISION 1
  23. #define DATE "22.1.95"
  24. #define VERS "sortad 2.1"
  25. #define VSTRING "sortad 2.1 (22.1.95)\r\n"
  26. #define VERSTAG "\0$VER: sortad 2.1 (22.1.95)"
  27. /*FE*/ /* $ENDDEFINE:   */
  28.  
  29. /* ------------------------------- include -------------------------------- */
  30.  
  31. #include <exec/types.h>
  32. #include <exec/memory.h>
  33. #include <exec/lists.h>
  34. #include <exec/nodes.h>
  35.  
  36. #include <dos/dos.h>
  37.  
  38. #include <clib/alib_stdio_protos.h>
  39.  
  40. #include <proto/exec.h>
  41. #include <proto/dos.h>
  42. #include <proto/utility.h>
  43.  
  44. #include <string.h>
  45.  
  46. struct AutoDoc
  47. {
  48.    struct Node ad_Node;
  49.    BPTR ad_TempFile;
  50. };
  51.  
  52. #define BUFFER_SIZE        1024
  53.  
  54. /* -------------------------- static data items --------------------------- */
  55.  
  56. static const STRPTR version = VERSTAG;
  57. static const STRPTR prgname = "sortad";
  58.  
  59. /* ------------------------- template definition -------------------------- */
  60.  
  61. #define template    "FROM/M,TO,TEMPDIR/K,BASENAME/K"
  62.  
  63. enum {
  64.    ARG_FROM,
  65.    ARG_TO,
  66.    ARG_TEMPDIR,
  67.    ARG_BASENAME,
  68.    ARG_MAX};
  69.  
  70. /* ---------------------- insert node sorted by name ---------------------- */
  71.  
  72. void insertbyname(struct List *list,struct Node *node);
  73.  
  74. void insertbyname(struct List *list,struct Node *node)
  75. {
  76.    struct Node *sn;
  77.    struct Node *in = NULL;
  78.  
  79.    for(sn = list->lh_Head ; sn->ln_Succ ; sn = sn->ln_Succ)
  80.    {
  81.       if(Stricmp(sn->ln_Name,node->ln_Name) > 0)
  82.       {
  83.          in = sn->ln_Pred;
  84.          if(!in->ln_Pred)
  85.             in = NULL;
  86.          break;
  87.       }
  88.    }
  89.  
  90.    if(!in && !sn->ln_Succ)
  91.       in = sn->ln_Pred;
  92.  
  93.    Insert(list,node,in);
  94. }
  95.  
  96. /* --------------------------- main entry point --------------------------- */
  97.  
  98. int main(void)
  99. {
  100.    struct RDArgs *args;
  101.    ULONG para[ARG_MAX];
  102.    STRPTR obj = prgname;
  103.    LONG err = 0;
  104.  
  105.    LONG i;
  106.  
  107.    /* clear args buffer */
  108.    for(i = 0 ; i < ARG_MAX ; i++)
  109.       para[i] = 0;
  110.  
  111.    /* here set your defaults : para[ARG_#?] = default_value; */
  112.  
  113.    if((args = ReadArgs(template,(LONG *) para,NULL)))
  114.    {
  115.       struct List list;
  116.       struct AutoDoc *ad;
  117.       UBYTE *buf;
  118.       UBYTE tmpname[50];
  119.       ULONG task = (ULONG) FindTask(NULL);
  120.       ULONG num = 0;
  121.       ULONG len;
  122.       BPTR tmpfh;
  123.       BPTR infh  = NULL;
  124.       BPTR outfh = NULL;
  125.       STRPTR *files = NULL;
  126.       STRPTR tmpdir = (para[ARG_TEMPDIR]) ? (STRPTR) para[ARG_TEMPDIR] : (STRPTR) "T:";
  127.       STRPTR basename = (STRPTR) para[ARG_BASENAME];
  128.  
  129.       NewList(&list);
  130.  
  131.       if(!para[ARG_FROM])
  132.          infh = Input();
  133.       else
  134.          files = (STRPTR *) para[ARG_FROM];
  135.  
  136.       if((buf = AllocVec(BUFFER_SIZE,MEMF_ANY)))
  137.       {
  138.          if(!para[ARG_TO])
  139.             outfh = Output();
  140.          else
  141.             outfh = Open((STRPTR) para[ARG_TO],MODE_NEWFILE);
  142.  
  143.          if(outfh)
  144.          {
  145.             do
  146.             {
  147.                if(files && *files)
  148.                {
  149.                   infh = Open(*files,MODE_OLDFILE);
  150.                   files++;
  151.                }
  152.  
  153.                while(FGets(infh,buf,BUFFER_SIZE-1))
  154.                {
  155.                   sprintf(tmpname,"%ssortad%lx%lx",tmpdir,num++,task);
  156.                   if((tmpfh = Open(tmpname,MODE_NEWFILE)))
  157.                   {
  158.                      STRPTR ptr = buf;
  159.  
  160.                      while(*ptr != ' ' && *ptr != '\n')
  161.                         ptr++;
  162.                      *ptr = '\0';
  163.  
  164.                      if(basename)
  165.                      {
  166.                         ptr = FilePart(buf);
  167.                         len = strlen(basename) + 1;
  168.                      } else
  169.                      {
  170.                         ptr = buf;
  171.                         len = 0;
  172.                      }
  173.  
  174.                      len += strlen(ptr) + 1;
  175.  
  176.                      if((ad = AllocVec(sizeof(struct AutoDoc) + len,MEMF_ANY)))
  177.                      {
  178.                         int ch;
  179.  
  180.                         ad->ad_Node.ln_Name = (STRPTR) (ad + 1);
  181.                         ad->ad_TempFile     = tmpfh;
  182.                         if(basename)
  183.                            sprintf(ad->ad_Node.ln_Name,"%s/%s",basename,ptr);
  184.                         else
  185.                            strcpy(ad->ad_Node.ln_Name,ptr);
  186.  
  187.                         insertbyname(&list,&ad->ad_Node);
  188.  
  189.                         while((ch = FGetC(infh)) != '\f')
  190.                            FPutC(tmpfh,ch);
  191.  
  192.                         if(ch == '\f')
  193.                            FPutC(tmpfh,'\f');
  194.                      } else
  195.                      {
  196.                         Close(tmpfh);
  197.                         break;
  198.                      }
  199.                   } else
  200.                      break;
  201.                }
  202.  
  203.                if(files && infh)
  204.                {
  205.                   Close(infh);
  206.                   infh = NULL;
  207.                }
  208.             } while(files && *files);
  209.  
  210.             FPuts(outfh,"TABLE OF CONTENTS\n\n");
  211.  
  212.             for(ad = (struct AutoDoc *) list.lh_Head ;
  213.                 ad->ad_Node.ln_Succ ;
  214.                 ad = (struct AutoDoc *) ad->ad_Node.ln_Succ)
  215.             {
  216.                FPrintf(outfh,"%s\n",ad->ad_Node.ln_Name);
  217.             }
  218.  
  219.             FPutC(outfh,'\f');
  220.  
  221.             while((ad = (struct AutoDoc *) RemHead(&list)))
  222.             {
  223.                Seek(ad->ad_TempFile,0,OFFSET_BEGINNING);
  224.  
  225.                sprintf(tmpname,"%%s%%%lds%%s\n",78-2*strlen(ad->ad_Node.ln_Name));
  226.  
  227.                FPrintf(outfh,tmpname,ad->ad_Node.ln_Name," ",ad->ad_Node.ln_Name);
  228.                Flush(outfh);
  229.  
  230.                while((len = Read(ad->ad_TempFile,buf,BUFFER_SIZE)))
  231.                   Write(outfh,buf,len);
  232.  
  233.                Close(ad->ad_TempFile);
  234.  
  235.                FreeVec(ad);
  236.             }
  237.  
  238.             if(para[ARG_TO])
  239.                Close(outfh);
  240.  
  241.             while(num)
  242.             {
  243.                num--;
  244.                sprintf(tmpname,"%ssortad%lx%lx",tmpdir,num,task);
  245.                DeleteFile(tmpname);
  246.             }
  247.          }
  248.          FreeVec(buf);
  249.       }
  250.  
  251.       FreeArgs(args);
  252.    }
  253.  
  254.    if(!err)
  255.       err = IoErr();
  256.  
  257.    if(err)
  258.    {
  259.       PrintFault(err,obj);
  260.       return(RETURN_ERROR);
  261.    }
  262.  
  263.    return(RETURN_OK);
  264. }
  265.  
  266.  
  267.