home *** CD-ROM | disk | FTP | other *** search
/ Programmer 7500 / MAX_PROGRAMMERS.iso / CLIPPER / MISC / EMXLIB8F.ZIP / EMX / LIB / IO / EADFEA.C < prev    next >
Encoding:
C/C++ Source or Header  |  1993-01-02  |  3.6 KB  |  164 lines

  1. /* eadfea.c (emx+gcc) -- Copyright (c) 1993 by Eberhard Mattes */
  2.  
  3. #define INCL_DOSFILEMGR
  4. #include <os2.h>
  5. #include <stdlib.h>
  6. #include <string.h>
  7. #include <errno.h>
  8. #include <sys/ead.h>
  9. #include "ea.h"
  10.  
  11. int _ead_fea2list_size (_ead ead)
  12. {
  13.   if (ead->count == 0)
  14.     return (0);
  15.   else
  16.     return ((int)ead->buffer->cbList);
  17. }
  18.  
  19.  
  20. const void *_ead_get_fea2list (_ead ead)
  21. {
  22.   if (ead->count == 0)
  23.     return (NULL);
  24.   else
  25.     return ((const void *)ead->buffer);
  26. }
  27.  
  28.  
  29. void *_ead_fea2list_to_fealist (const void *src)
  30. {
  31.   const FEA2LIST *s;
  32.   const FEA2 *ps;
  33.   PFEALIST d;
  34.   PFEA pd;
  35.   ULONG size, add;
  36.   char *q;
  37.  
  38.   s = (const FEA2LIST *)src;
  39.   size = sizeof (ULONG);
  40.   if (s->cbList > sizeof (ULONG))
  41.     {
  42.       ps = &s->list[0];
  43.       for (;;)
  44.         {
  45.           add = sizeof (FEA) + 1 + ps->cbName + ps->cbValue;
  46.           size += add;
  47.           if (ps->oNextEntryOffset == 0)
  48.             break;
  49.           ps = (const FEA2 *)((char *)ps + ps->oNextEntryOffset);
  50.         }
  51.     }
  52.   d = malloc (size);
  53.   if (d == NULL)
  54.     {
  55.       errno = ENOMEM;
  56.       return (NULL);
  57.     }
  58.   d->cbList = size;
  59.   pd = &d->list[0];
  60.   if (s->cbList > sizeof (ULONG))
  61.     {
  62.       ps = &s->list[0];
  63.       for (;;)
  64.         {
  65.           pd->fEA = ps->fEA;
  66.           pd->cbName = ps->cbName;
  67.           pd->cbValue = ps->cbValue;
  68.           q = (char *)pd + sizeof (FEA);
  69.           memcpy (q, ps->szName, ps->cbName + 1);
  70.           q += ps->cbName + 1;
  71.           memcpy (q, ps->szName + ps->cbName + 1, ps->cbValue);
  72.           q += ps->cbValue;
  73.           pd = (PFEA)q;
  74.           if (ps->oNextEntryOffset == 0)
  75.             break;
  76.           ps = (const FEA2 *)((char *)ps + ps->oNextEntryOffset);
  77.         }
  78.     }
  79.   return (d);
  80. }
  81.  
  82.  
  83. void *_ead_fealist_to_fea2list (const void *src)
  84. {
  85.   const FEALIST *s;
  86.   const FEA *ps;
  87.   PFEA2LIST d;
  88.   PFEA2 pd;
  89.   ULONG size, add, offset, *patch;
  90.   char *q;
  91.   const char *t;
  92.  
  93.   s = (const FEALIST *)src;
  94.   size = sizeof (ULONG);
  95.   offset = sizeof (ULONG);
  96.   while (offset < s->cbList)
  97.     {
  98.       ps = (const FEA *)((char *)src + offset);
  99.       size += _EA_SIZE2 (ps);
  100.       offset += sizeof (FEA) + 1 + ps->cbName + ps->cbValue;
  101.     }
  102.   d = malloc (size);
  103.   if (d == NULL)
  104.     {
  105.       errno = ENOMEM;
  106.       return (NULL);
  107.     }
  108.   d->cbList = size;
  109.   pd = &d->list[0];
  110.   offset = sizeof (ULONG);
  111.   patch = NULL;
  112.   while (offset < s->cbList)
  113.     {
  114.       ps = (const FEA *)((char *)src + offset);
  115.       pd->fEA = ps->fEA;
  116.       pd->cbName = ps->cbName;
  117.       pd->cbValue = ps->cbValue;
  118.       t = (char *)src + offset + sizeof (FEA);
  119.       q = pd->szName;
  120.       memcpy (q, t, ps->cbName + 1);
  121.       t += ps->cbName + 1;
  122.       q += ps->cbName + 1;
  123.       memcpy (q, t, ps->cbValue);
  124.       add = _EA_SIZE2 (ps);
  125.       patch = &pd->oNextEntryOffset;
  126.       pd->oNextEntryOffset = add;
  127.       pd = (PFEA2)((char *)pd + add);
  128.       offset += sizeof (FEA) + 1 + ps->cbName + ps->cbValue;
  129.     }
  130.   if (patch != NULL)
  131.     *patch = 0;
  132.   return (d);
  133. }
  134.  
  135.  
  136. int _ead_use_fea2list (_ead ead, const void *src)
  137. {
  138.   const FEA2LIST *s;
  139.   PFEA2 pfea;
  140.   int count;
  141.  
  142.   s = src;
  143.   ead->count = 0;
  144.   if (_ead_size_buffer (ead, s->cbList) < 0)
  145.     return (-1);
  146.   memcpy (ead->buffer, src, s->cbList);
  147.   count = 0;
  148.   if (s->cbList > sizeof (ULONG))
  149.     {
  150.       pfea = &ead->buffer->list[0];
  151.       for (;;)
  152.         {
  153.           ++count;
  154.           if (pfea->oNextEntryOffset == 0)
  155.             break;
  156.           pfea = (PFEA2)((char *)pfea + pfea->oNextEntryOffset);
  157.         }
  158.     }
  159.   if (_ead_make_index (ead, count) < 0)
  160.     return (-1);
  161.   ead->count = count;
  162.   return (0);
  163. }
  164.