home *** CD-ROM | disk | FTP | other *** search
/ Magazyn Exec 4 / CD_Magazyn_EXEC_nr_4.iso / Recent / dev / c / apputil.lha / apputil / readargs.c < prev    next >
Encoding:
C/C++ Source or Header  |  2000-11-04  |  3.9 KB  |  204 lines

  1. /*
  2.  * readargs.c
  3.  * ==========
  4.  * Functions for parsing command line arguments and WB ToolTypes.
  5.  *
  6.  * Copyright (C) 1999-2000 HÃ¥kan L. Younes (lorens@hem.passagen.se)
  7.  */
  8.  
  9. #include <exec/memory.h>
  10.  
  11. #include <proto/dos.h>
  12. #include <proto/exec.h>
  13. #include <proto/icon.h>
  14.  
  15. #include "apputil.h"
  16.  
  17.  
  18. static struct Library *iconBase;
  19.  
  20. #define IconBase iconBase
  21.  
  22.  
  23. static BOOL FullName(struct WBArg *wa, STRPTR buf, LONG len) {
  24.   if (len == 0) {
  25.     return FALSE;
  26.   }
  27.  
  28.   if (NameFromLock(wa->wa_Lock, buf, len)) {
  29.     if (AddPart(buf, wa->wa_Name, len)) {
  30.       return TRUE;
  31.     } else {
  32.       SetIoErr(ERROR_LINE_TOO_LONG);
  33.     }
  34.   }
  35.  
  36.   return FALSE;
  37. }
  38.  
  39.  
  40. static BOOL AddToolTypes(struct WBArg *wa, STRPTR *buf, LONG *len) {
  41.   BPTR oldLock = -1;
  42.   struct DiskObject *diskObj;
  43.   STRPTR *tt;
  44.   STRPTR str, pos;
  45.   BOOL success = FALSE;
  46.  
  47.   if (wa->wa_Lock != NULL) {
  48.     oldLock = CurrentDir(wa->wa_Lock);
  49.   }
  50.  
  51.   iconBase = OpenLibrary("icon.library", 33L);
  52.   if (iconBase != NULL) {
  53.     diskObj = GetDiskObject(wa->wa_Name);
  54.     if (diskObj != NULL) {
  55.       *len = 0;
  56.       for (tt = diskObj->do_ToolTypes; *tt != NULL; tt++) {
  57.     if (**tt != '(') {
  58.       *len += strlen(*tt) + 1;
  59.     }
  60.       }
  61.  
  62.       if (*len > 0) {
  63.     *buf = AllocVec((*len + 1) * sizeof **buf, MEMF_PUBLIC);
  64.     if (*buf != NULL) {
  65.       pos = *buf;
  66.       for (tt = diskObj->do_ToolTypes; *tt != NULL; tt++) {
  67.         for (str = *tt; *str != '\0'; str++) {
  68.           *pos++ = (*str == '|') ? ' ' : *str;
  69.         }
  70.         *pos++ = ' ';
  71.       }
  72.       *(pos - 1) = '\0';
  73.       (*len)--;
  74.       success = TRUE;
  75.     }
  76.       } else {
  77.     success = TRUE;
  78.       }
  79.  
  80.       FreeDiskObject(diskObj);
  81.     }
  82.     CloseLibrary(iconBase);
  83.   }
  84.  
  85.   if (oldLock != -1) {
  86.     CurrentDir(oldLock);
  87.   }
  88.  
  89.   return success;
  90. }
  91.  
  92.  
  93. static BOOL AddFiles(struct WBArg *wa, LONG n, STRPTR *buf, LONG *len) {
  94.   STRPTR tmp, pos;
  95.   LONG bufSize, remSize;
  96.   LONG i;
  97.  
  98.   if (n == 0) {
  99.     return TRUE;
  100.   }
  101.  
  102. #define BUFBLOCK 256
  103.   bufSize = BUFBLOCK + *len;
  104.   remSize = BUFBLOCK;
  105. #undef BUFBLOCK
  106.   tmp = AllocVec(bufSize * sizeof *tmp, MEMF_PUBLIC);
  107.   if (tmp == NULL) {
  108.     return FALSE;
  109.   }
  110.  
  111.   if (*buf != NULL) {
  112.     CopyMem(*buf, tmp, *len);
  113.     FreeVec(*buf);
  114.     (*len)++;
  115.     pos = tmp + *len;
  116.     *(pos - 1) = ' ';
  117.     remSize--;
  118.   } else {
  119.     *len = 0;
  120.     pos = tmp;
  121.   }
  122.  
  123.   *buf = tmp;
  124.   for (i = 0; i < n; i++) {
  125.     while (!FullName(wa + i, pos, remSize - 1)) {
  126.       if (IoErr() == ERROR_LINE_TOO_LONG) {
  127.     remSize += bufSize;
  128.     bufSize *= 2;
  129.     tmp = AllocVec(bufSize * sizeof *tmp, MEMF_PUBLIC);
  130.     if (tmp == NULL) {
  131.       return FALSE;
  132.     }
  133.  
  134.     CopyMem(*buf, tmp, *len);
  135.     FreeVec(*buf);
  136.     *buf = tmp;
  137.       } else {
  138.     return FALSE;
  139.       }
  140.     }
  141.     *len += strlen(pos) + 1;
  142.     pos = *buf + *len;
  143.     remSize = bufSize - *len;
  144.     *(pos - 1) = ' ';
  145.   }
  146.   *(pos - 1) = '\0';
  147.   (*len)--;
  148.  
  149.   return TRUE;
  150. }
  151.  
  152.  
  153. struct RDArgs *ReadArgsCLI(STRPTR template, LONG *array) {
  154.   struct RDArgs *rdargs;
  155.  
  156.   rdargs = AllocDosObject(DOS_RDARGS, NULL);
  157.   if (rdargs != NULL) {
  158.     rdargs->RDA_Source.CS_Buffer = NULL;
  159.     rdargs->RDA_DAList = NULL;
  160.     rdargs->RDA_Buffer = NULL;
  161.     rdargs->RDA_Flags = 0;
  162.     ReadArgs(template, array, rdargs);
  163.   }
  164.  
  165.   return rdargs;
  166. }
  167.  
  168.  
  169. struct RDArgs *ReadArgsWB(STRPTR template, LONG *array,
  170.               struct WBStartup *sm) {
  171.   STRPTR buf = NULL;
  172.   LONG len = 0;
  173.   struct RDArgs *rdargs = NULL;
  174.  
  175.   if (AddToolTypes(sm->sm_ArgList, &buf, &len) &&
  176.       AddFiles(sm->sm_ArgList + 1, sm->sm_NumArgs - 1, &buf, &len)) {
  177.     if (buf != NULL) {
  178.       rdargs = AllocDosObject(DOS_RDARGS, NULL);
  179.       if (rdargs != NULL) {
  180.     buf[len] = '\n';
  181.     buf[len + 1] = '\0';
  182.     rdargs->RDA_Source.CS_Buffer = buf;
  183.     rdargs->RDA_Source.CS_Length = len + 1;
  184.     rdargs->RDA_Source.CS_CurChr = 0;
  185.     rdargs->RDA_DAList = NULL;
  186.     rdargs->RDA_Buffer = NULL;
  187.     rdargs->RDA_Flags = RDAF_NOPROMPT;
  188.     ReadArgs(template, array, rdargs);
  189.       }
  190.     }
  191.   }
  192.   FreeVec(buf);
  193.  
  194.   return rdargs;
  195. }
  196.  
  197.  
  198. VOID FreeArgsCLIWB(struct RDArgs *rdargs) {
  199.   if (rdargs != NULL) {
  200.     FreeArgs(rdargs);
  201.     FreeDosObject(DOS_RDARGS, rdargs);
  202.   }
  203. }
  204.