home *** CD-ROM | disk | FTP | other *** search
/ MacFormat 1994 November / macformat-018.iso / Utility Spectacular / Developer / macgambit-20-compiler-src-p1 / Runtime (.c & .h) / strings.c < prev    next >
Encoding:
C/C++ Source or Header  |  1994-07-26  |  3.1 KB  |  151 lines  |  [TEXT/KAHL]

  1. /* String manipulation */
  2.  
  3. #include "params.h"
  4. #include "gambit.h"
  5. #include "struct.h"
  6. #include "os.h"
  7. #include "mem.h"
  8.  
  9.  
  10. /*---------------------------------------------------------------------------*/
  11.  
  12.  
  13. long string_length( str )
  14. char *str;
  15. { long len = 0;
  16.   while (*(str++) != '\0') len++;
  17.   return len;
  18. }
  19.  
  20.  
  21. char *string_extend( ptr, str )
  22. char *ptr, *str;
  23. { while (*str != '\0') *(ptr++) = *(str++);
  24.   *ptr = '\0';
  25.   return ptr;
  26. }
  27.  
  28.  
  29. char *string_append( str1, str2 )
  30. char *str1, *str2;
  31. { char *p1;
  32.   if ((str1 == NULL) || (str2 == NULL)) return NULL;
  33.   p1 = local_malloc8( string_length( str1 ) + string_length( str2 ) + 1 );
  34.   if (p1 == NULL) return NULL;
  35.   string_extend( string_extend( p1, str1 ), str2 );
  36.   return p1;
  37. }
  38.  
  39.  
  40. char *string_copy( str )
  41. char *str;
  42. { return string_append( str, "" );
  43. }
  44.  
  45.  
  46. long string_compare( str1, str2 )
  47. char *str1, *str2;
  48. { while ((*str1 != '\0') && (*str2 != '\0'))
  49.     if (*str1 != *str2) break; else { str1++; str2++; }
  50.   if (*str1 < *str2) return -1;
  51.   if (*str1 > *str2) return 1;
  52.   return 0;
  53. }
  54.  
  55.  
  56. long string_to_int( str )
  57. char *str;
  58. { char *p = str;
  59.   long n = 0;
  60.   if ((*p == '-') || (*p == '+')) p++;
  61.   while ((*p >= '0') && (*p <= '9')) n = n*10 - (*p++ - '0');
  62.   if (*p != '\0')
  63.     return 0;
  64.   else if (*str == '-')
  65.     return n;
  66.   else
  67.     return -n;
  68. }
  69.  
  70.  
  71. char *string_to_c_str( str )
  72. SCM_obj str;
  73. { long len = SCM_length( str );
  74.   char *p = local_malloc8( len + 1 );
  75.   if (p == NULL) return NULL;
  76.   p[len] = '\0';
  77.   while (len-- > 0) p[len] = SCM_obj_to_str(str)[len];
  78.   return p;
  79. }
  80.  
  81.  
  82. SCM_obj c_str_to_string( str ) /* converts C string to Scheme, without GC */
  83. char *str;
  84. { SCM_obj result;
  85.   char *p = str;
  86.   long len = 0;
  87.   while (*(p++) != '\0') len++;
  88.  
  89.   if (alloc_subtyped( len, (long)SCM_subtype_STRING, &result ))
  90.     return SCM_false;
  91.  
  92.   p = (char *)(result - SCM_type_SUBTYPED + 4);
  93.   while (*str != '\0') *(p++) = *(str++);
  94.   return result;
  95. }
  96.  
  97.  
  98. #define hex( c, var ) \
  99. { if (((c) >= 'a') && ((c) <= 'f')) var = ((c) - 'a') + 10; \
  100.   else if (((c) >= '0') && ((c) <= '9')) var = (c) - '0'; \
  101.   else return NULL; \
  102. }
  103.  
  104.  
  105. char *c_id_to_symbol( str )
  106. char *str;
  107. { char *buf;
  108.   char c;
  109.   long n = 0, i = 0;
  110.  
  111.   while (str[i] != '\0') if (str[i++] == 'X') n--; else n++;
  112.   if (n<0) return NULL;
  113.   buf = local_malloc8( n + 1 );
  114.   if (buf == NULL) return NULL;
  115.  
  116.   for (i=0; i<n; i++)
  117.   { c = *(str++);
  118.     switch (c)
  119.     { case 'D': buf[i] = '-'; break;
  120.       case 'B': buf[i] = '!'; break;
  121.       case 'P': buf[i] = '+'; break;
  122.       case 'A': buf[i] = '*'; break;
  123.       case 'S': buf[i] = '/'; break;
  124.       case 'L': buf[i] = '<'; break;
  125.       case 'E': buf[i] = '='; break;
  126.       case 'G': buf[i] = '>'; break;
  127.       case 'Q': buf[i] = '?'; break;
  128.       default:
  129.         if (((c >= 'a') && (c <= 'z')) ||
  130.             ((c >= '0') && (c <= '9')) ||
  131.             (c == '_'))
  132.           buf[i] = c;
  133.         else if (c == 'X')
  134.           { long h1, h2;
  135.             c = *(str++); hex( c, h1 );
  136.             c = *(str++); hex( c, h2 );
  137.             buf[i] = h1*16+h2;
  138.           }
  139.         else
  140.           return NULL;
  141.     }
  142.   }
  143.  
  144.   buf[n] = '\0';
  145.  
  146.   return buf;
  147. }
  148.  
  149.  
  150. /*---------------------------------------------------------------------------*/
  151.