home *** CD-ROM | disk | FTP | other *** search
/ Celestin Apprentice 7 / Apprentice-Release7.iso / Source Code / C / Applications / Moscow ML 1.42 / src / !runtime / str.c < prev    next >
Encoding:
C/C++ Source or Header  |  1997-08-18  |  2.8 KB  |  105 lines  |  [TEXT/R*ch]

  1. /* Operations on strings */
  2.  
  3. #include "alloc.h"
  4. #include "debugger.h"
  5. #include "mlvalues.h"
  6.  
  7. mlsize_t string_length(s)
  8.      value s;
  9. {
  10.   mlsize_t temp;
  11.   temp = Bosize_val(s) - 1;
  12.   Assert (Byte (s, temp - Byte (s, temp)) == 0);
  13.   return temp - Byte (s, temp);
  14. }
  15.  
  16. value create_string(len)        /* ML */
  17.      value len;
  18. {
  19.   return alloc_string(Long_val(len));
  20. }
  21.  
  22. value compare_strings(s1, s2)   /* ML */
  23.      value s1, s2;
  24. {
  25.   mlsize_t len1, len2;
  26.   register mlsize_t len;
  27.   register unsigned char * p1, * p2;
  28.  
  29.   len1 = string_length(s1);
  30.   len2 = string_length(s2);
  31.   for (len = (len1 <= len2 ? len1 : len2),
  32.          p1 = (unsigned char *) String_val(s1),
  33.          p2 = (unsigned char *) String_val(s2);
  34.        len > 0;
  35.        len--, p1++, p2++)
  36.     if (*p1 != *p2)
  37.       return (*p1 < *p2 ? Val_long(-1) : Val_long(1));
  38.   if (len1 == len2)
  39.     return Val_long(0);
  40.   else if (len1 < len2)
  41.     return Val_long(-2);
  42.   else
  43.     return Val_long(2);
  44. }
  45.  
  46. value blit_string(s1, offset1, s2, offset2, len) /* ML */
  47.      value s1, offset1, s2, offset2, len;
  48. {
  49.   bcopy(&Byte(s1, Long_val(offset1)),
  50.         &Byte(s2, Long_val(offset2)),
  51.         Int_val(len));
  52.   return Atom(0);
  53. }
  54.  
  55. value fill_string(s, offset, len, init) /* ML */
  56.      value s, offset, len, init;
  57. {
  58.   register char * p;
  59.   register mlsize_t n;
  60.   register char c;
  61.  
  62.   c = Long_val(init);
  63.   for(p = &Byte(s, Long_val(offset)), n = Long_val(len);
  64.       n > 0; n--, p++)
  65.     *p = c;
  66.   return Atom(0);
  67. }
  68.  
  69. #ifdef unix
  70. static unsigned char printable_chars_ascii[] = /* 0x20-0x7E */
  71.   "\000\000\000\000\377\377\377\377\377\377\377\377\377\377\377\177\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000";
  72. static unsigned char printable_chars_iso[] = /* 0x20-0x7E 0xA1-0xFF */
  73.   "\000\000\000\000\377\377\377\377\377\377\377\377\377\377\377\177\000\000\000\000\376\377\377\377\377\377\377\377\377\377\377\377";
  74. #endif
  75. #ifdef macintosh
  76. static unsigned char printable_chars[] = /* 0x20-0x7E 0x80-0xC9 0xCB-0xD8 */
  77.   "\000\000\000\000\377\377\377\377\377\377\377\377\377\377\377\177\377\377\377\377\377\377\377\377\377\373\377\001\000\000\000\000";
  78. #endif
  79. #ifdef MSDOS
  80. static unsigned char printable_chars[] = /* 0x20-0xFE */
  81.   "\000\000\000\000\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\177";
  82. #endif
  83.  
  84. value is_printable(chr) /* ML */
  85.      value chr;
  86. {
  87.   int c;
  88. #ifdef unix
  89.   static int iso_charset = -1;
  90.   unsigned char * printable_chars;
  91.  
  92.   if (iso_charset == -1) {
  93.     char * lc_ctype = (char *) getenv("LC_CTYPE");
  94.     if (lc_ctype != 0 && strcmp(lc_ctype, "iso_8859_1") == 0)
  95.       iso_charset = 1;
  96.     else
  97.       iso_charset = 0;
  98.   }
  99.   printable_chars = iso_charset ? printable_chars_iso : printable_chars_ascii;
  100. #endif
  101.  
  102.   c = Int_val(chr);
  103.   return Val_bool(printable_chars[c >> 3] & (1 << (c & 7)));
  104. }
  105.