114 lines
2.9 KiB
C
114 lines
2.9 KiB
C
/* Operations on strings */
|
|
|
|
#include <string.h>
|
|
#include "alloc.h"
|
|
#include "fail.h"
|
|
#include "mlvalues.h"
|
|
#include "misc.h"
|
|
|
|
mlsize_t string_length(s)
|
|
value s;
|
|
{
|
|
mlsize_t temp;
|
|
temp = Bosize_val(s) - 1;
|
|
Assert (Byte (s, temp - Byte (s, temp)) == 0);
|
|
return temp - Byte (s, temp);
|
|
}
|
|
|
|
value ml_string_length(s) /* ML */
|
|
value s;
|
|
{
|
|
mlsize_t temp;
|
|
temp = Bosize_val(s) - 1;
|
|
Assert (Byte (s, temp - Byte (s, temp)) == 0);
|
|
return Val_long(temp - Byte (s, temp));
|
|
}
|
|
|
|
value create_string(len) /* ML */
|
|
value len;
|
|
{
|
|
mlsize_t size = Long_val(len);
|
|
if (size > Max_wosize * sizeof(value) - 2) invalid_argument("String.create");
|
|
return alloc_string(size);
|
|
}
|
|
|
|
value string_get(str, index) /* ML */
|
|
value str, index;
|
|
{
|
|
long idx = Long_val(index);
|
|
if (idx < 0 || idx >= string_length(str)) invalid_argument("String.get");
|
|
return Val_int(Byte_u(str, idx));
|
|
}
|
|
|
|
value string_set(str, index, newval) /* ML */
|
|
value str, index, newval;
|
|
{
|
|
long idx = Long_val(index);
|
|
if (idx < 0 || idx >= string_length(str)) invalid_argument("String.set");
|
|
Byte_u(str, idx) = Int_val(newval);
|
|
return Val_unit;
|
|
}
|
|
|
|
value string_equal(s1, s2) /* ML */
|
|
value s1, s2;
|
|
{
|
|
mlsize_t sz1 = Wosize_val(s1);
|
|
mlsize_t sz2 = Wosize_val(s2);
|
|
value * p1, * p2;
|
|
if (sz1 != sz2) return Val_false;
|
|
for(p1 = Op_val(s1), p2 = Op_val(s2); sz1 > 0; sz1--, p1++, p2++)
|
|
if (*p1 != *p2) return Val_false;
|
|
return Val_true;
|
|
}
|
|
|
|
value string_notequal(s1, s2) /* ML */
|
|
value s1, s2;
|
|
{
|
|
return Val_not(string_equal(s1, s2));
|
|
}
|
|
|
|
value blit_string(s1, ofs1, s2, ofs2, n) /* ML */
|
|
value s1, ofs1, s2, ofs2, n;
|
|
{
|
|
bcopy(&Byte(s1, Long_val(ofs1)), &Byte(s2, Long_val(ofs2)), Int_val(n));
|
|
return Val_unit;
|
|
}
|
|
|
|
value fill_string(s, offset, len, init) /* ML */
|
|
value s, offset, len, init;
|
|
{
|
|
register char * p;
|
|
register mlsize_t n;
|
|
register char c;
|
|
|
|
c = Long_val(init);
|
|
for(p = &Byte(s, Long_val(offset)), n = Long_val(len);
|
|
n > 0; n--, p++)
|
|
*p = c;
|
|
return Val_unit;
|
|
}
|
|
|
|
static unsigned char printable_chars_ascii[] = /* 0x20-0x7E */
|
|
"\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";
|
|
static unsigned char printable_chars_iso[] = /* 0x20-0x7E 0xA1-0xFF */
|
|
"\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";
|
|
|
|
value is_printable(chr) /* ML */
|
|
value chr;
|
|
{
|
|
int c;
|
|
static int iso_charset = -1;
|
|
unsigned char * printable_chars;
|
|
|
|
if (iso_charset == -1) {
|
|
char * lc_ctype = (char *) getenv("LC_CTYPE");
|
|
if (lc_ctype != 0 && strcmp(lc_ctype, "iso_8859_1") == 0)
|
|
iso_charset = 1;
|
|
else
|
|
iso_charset = 0;
|
|
}
|
|
printable_chars = iso_charset ? printable_chars_iso : printable_chars_ascii;
|
|
c = Int_val(chr);
|
|
return Val_bool(printable_chars[c >> 3] & (1 << (c & 7)));
|
|
}
|