home *** CD-ROM | disk | FTP | other *** search
/ rtsi.com / 2014.01.www.rtsi.com.tar / www.rtsi.com / OS9 / MM1 / SOUNDUTILS / tracker.4.6.lzh / TRACKER4.6 / tags.c < prev    next >
Text File  |  1994-11-24  |  2KB  |  136 lines

  1. /* tags.c 
  2.     vi:ts=3 sw=3:
  3.  */
  4.  
  5. /* $Id: tags.c,v 4.3 1994/11/15 16:11:01 espie Exp espie $
  6.  * $Log: tags.c,v $
  7.  * Revision 4.3  1994/11/15  16:11:01  espie
  8.  * *** empty log message ***
  9.  *
  10.  */
  11.  
  12. #include "defs.h"
  13.  
  14. #ifdef MALLOC_NOT_IN_STDLIB
  15. #include <malloc.h>
  16. #else
  17. #include <stdlib.h>
  18. #endif
  19.  
  20. #include "tags.h"
  21.  
  22. ID("$Id: tags.c,v 4.3 1994/11/15 16:11:01 espie Exp espie $")
  23.  
  24. #if 0
  25. unsigned long tags_length(t)
  26. struct tag *t;
  27.    {
  28.    unsigned long i;
  29.  
  30.    i = 0;
  31.  
  32.    for (;;)
  33.       {
  34.       switch(t->type)
  35.          {
  36.       case TAG_END:
  37.          return i;
  38.       case TAG_IGNORE:
  39.          t++;
  40.          break;
  41.       case TAG_SKIP:
  42.          t += t->data.scalar;
  43.          break;
  44.       case TAG_SUB:
  45.          i += tags_length(t->data.pointer);
  46.          break;
  47.       case TAG_JUMP:
  48.          i += tags_length(t->data.pointer);
  49.          return i;
  50.       default:
  51.          i++;
  52.          }
  53.       }
  54.    }
  55.  
  56. LOCAL struct tag *copy_scan(dest, orig)
  57. struct tag *dest;
  58. struct tag *orig;
  59.    {
  60.    switch (orig->type)
  61.       {
  62.    case TAG_END:
  63.       return dest;
  64.    case TAG_IGNORE:
  65.       ++orig;
  66.       break;
  67.    case TAG_SKIP:
  68.       orig += orig->data.scalar;
  69.       break;
  70.    case TAG_SUB:
  71.       dest = copy_scan(dest, orig->data.pointer);
  72.       break;
  73.    case TAG_JUMP:
  74.       orig = orig->data.pointer;
  75.       break;
  76.    default:
  77.       *dest++ = *orig++;
  78.       }
  79.    return copy_scan(dest, orig);
  80.    }
  81.  
  82. struct tag *tags_copy(t)
  83. struct tag *t;
  84.    {
  85.    unsigned long i;
  86.    struct tag *c, *e;
  87.    
  88.    i = tags_length(t);
  89.    c = (struct tag *)malloc(sizeof(struct tag) * (i+1));
  90.    e = copy_scan(c, t);
  91.    e->type = TAG_END;
  92.    return c;
  93.    }
  94.  
  95. struct tag *alloc_tags(l)
  96. unsigned long l;
  97.    {
  98.    struct tag *c;
  99.    unsigned long i;
  100.    
  101.    c = ( struct tag *) malloc(sizeof(struct tag) * (l + 1));
  102.    if (!c)
  103.       return 0;
  104.    for (i = 0; i < l; i++)
  105.       c[i].type = TAG_IGNORE;
  106.    c[l].type = TAG_END;
  107.    return c;
  108.    }
  109.  
  110. #endif
  111. /* WARNING: TAG_SUB is not supported */
  112. struct tag *get_tag(t)
  113. struct tag *t;
  114.    {
  115.    forever
  116.       {
  117.       switch (t->type)
  118.          {
  119.       case TAG_END:
  120.          return 0;
  121.       case TAG_IGNORE:
  122.          t++;
  123.          return get_tag(t);
  124.       case TAG_SKIP:
  125.          t += t->data.scalar;
  126.          break;
  127.       case TAG_JUMP:
  128.          t = t->data.pointer;
  129.          break;
  130.       default:
  131.          return t;
  132.          }
  133.       }
  134.    }
  135.       
  136.