renaming 'char' type to 'byte' to avoid confusion
wchar will be used for all individual characters adding string.find function fixing bug in #sym(...) if sym was undefined
This commit is contained in:
		
							parent
							
								
									8e4ba69a7b
								
							
						
					
					
						commit
						830e1c986c
					
				| 
						 | 
				
			
			@ -9,7 +9,7 @@ static int ALIGN2, ALIGN4, ALIGN8, ALIGNPTR;
 | 
			
		|||
 | 
			
		||||
value_t int8sym, uint8sym, int16sym, uint16sym, int32sym, uint32sym;
 | 
			
		||||
value_t int64sym, uint64sym;
 | 
			
		||||
value_t longsym, ulongsym, charsym, wcharsym;
 | 
			
		||||
value_t longsym, ulongsym, bytesym, wcharsym;
 | 
			
		||||
value_t floatsym, doublesym;
 | 
			
		||||
value_t gftypesym, stringtypesym, wcstringtypesym;
 | 
			
		||||
value_t emptystringsym;
 | 
			
		||||
| 
						 | 
				
			
			@ -25,7 +25,7 @@ static fltype_t *int32type, *uint32type;
 | 
			
		|||
static fltype_t *int64type, *uint64type;
 | 
			
		||||
static fltype_t *longtype, *ulongtype;
 | 
			
		||||
static fltype_t *floattype, *doubletype;
 | 
			
		||||
       fltype_t *chartype, *wchartype;
 | 
			
		||||
       fltype_t *bytetype, *wchartype;
 | 
			
		||||
       fltype_t *stringtype, *wcstringtype;
 | 
			
		||||
       fltype_t *builtintype;
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -231,11 +231,11 @@ static void cv_pin(cvalue_t *cv)
 | 
			
		|||
}
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
#define num_ctor(typenam, cnvt, tag)                                    \
 | 
			
		||||
#define num_ctor(typenam, ctype, cnvt, tag)                             \
 | 
			
		||||
static void cvalue_##typenam##_init(fltype_t *type, value_t arg,        \
 | 
			
		||||
                                    void *dest)                         \
 | 
			
		||||
{                                                                       \
 | 
			
		||||
    typenam##_t n=0;                                                    \
 | 
			
		||||
    ctype##_t n=0;                                                      \
 | 
			
		||||
    (void)type;                                                         \
 | 
			
		||||
    if (isfixnum(arg)) {                                                \
 | 
			
		||||
        n = numval(arg);                                                \
 | 
			
		||||
| 
						 | 
				
			
			@ -244,14 +244,14 @@ static void cvalue_##typenam##_init(fltype_t *type, value_t arg,        \
 | 
			
		|||
        cvalue_t *cv = (cvalue_t*)ptr(arg);                             \
 | 
			
		||||
        void *p = cv_data(cv);                                          \
 | 
			
		||||
        if (valid_numtype(cv_numtype(cv)))                              \
 | 
			
		||||
            n = (typenam##_t)conv_to_##cnvt(p, cv_numtype(cv));         \
 | 
			
		||||
            n = (ctype##_t)conv_to_##cnvt(p, cv_numtype(cv));           \
 | 
			
		||||
        else                                                            \
 | 
			
		||||
            goto cnvt_error;                                            \
 | 
			
		||||
    }                                                                   \
 | 
			
		||||
    else {                                                              \
 | 
			
		||||
        goto cnvt_error;                                                \
 | 
			
		||||
    }                                                                   \
 | 
			
		||||
    *((typenam##_t*)dest) = n;                                          \
 | 
			
		||||
    *((ctype##_t*)dest) = n;                                            \
 | 
			
		||||
    return;                                                             \
 | 
			
		||||
 cnvt_error:                                                            \
 | 
			
		||||
    type_error(#typenam, "number", arg);                                \
 | 
			
		||||
| 
						 | 
				
			
			@ -259,37 +259,37 @@ static void cvalue_##typenam##_init(fltype_t *type, value_t arg,        \
 | 
			
		|||
value_t cvalue_##typenam(value_t *args, u_int32_t nargs)                \
 | 
			
		||||
{                                                                       \
 | 
			
		||||
    if (nargs==0) { PUSH(fixnum(0)); args = &Stack[SP-1]; }             \
 | 
			
		||||
    value_t cv = cvalue(typenam##type, sizeof(typenam##_t));            \
 | 
			
		||||
    value_t cv = cvalue(typenam##type, sizeof(ctype##_t));              \
 | 
			
		||||
    cvalue_##typenam##_init(typenam##type,                              \
 | 
			
		||||
                            args[0], &((cvalue_t*)ptr(cv))->_space[0]); \
 | 
			
		||||
    return cv;                                                          \
 | 
			
		||||
}                                                                       \
 | 
			
		||||
value_t mk_##typenam(typenam##_t n)                                     \
 | 
			
		||||
value_t mk_##typenam(ctype##_t n)                                       \
 | 
			
		||||
{                                                                       \
 | 
			
		||||
    value_t cv = cvalue(typenam##type, sizeof(typenam##_t));            \
 | 
			
		||||
    *(typenam##_t*)&((cvalue_t*)ptr(cv))->_space[0] = n;                \
 | 
			
		||||
    value_t cv = cvalue(typenam##type, sizeof(ctype##_t));              \
 | 
			
		||||
    *(ctype##_t*)&((cvalue_t*)ptr(cv))->_space[0] = n;                  \
 | 
			
		||||
    return cv;                                                          \
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
num_ctor(int8, int32, T_INT8)
 | 
			
		||||
num_ctor(uint8, uint32, T_UINT8)
 | 
			
		||||
num_ctor(int16, int32, T_INT16)
 | 
			
		||||
num_ctor(uint16, uint32, T_UINT16)
 | 
			
		||||
num_ctor(int32, int32, T_INT32)
 | 
			
		||||
num_ctor(uint32, uint32, T_UINT32)
 | 
			
		||||
num_ctor(int64, int64, T_INT64)
 | 
			
		||||
num_ctor(uint64, uint64, T_UINT64)
 | 
			
		||||
num_ctor(char, uint32, T_UINT8)
 | 
			
		||||
num_ctor(wchar, int32, T_INT32)
 | 
			
		||||
num_ctor(int8, int8, int32, T_INT8)
 | 
			
		||||
num_ctor(uint8, uint8, uint32, T_UINT8)
 | 
			
		||||
num_ctor(int16, int16, int32, T_INT16)
 | 
			
		||||
num_ctor(uint16, uint16, uint32, T_UINT16)
 | 
			
		||||
num_ctor(int32, int32, int32, T_INT32)
 | 
			
		||||
num_ctor(uint32, uint32, uint32, T_UINT32)
 | 
			
		||||
num_ctor(int64, int64, int64, T_INT64)
 | 
			
		||||
num_ctor(uint64, uint64, uint64, T_UINT64)
 | 
			
		||||
num_ctor(byte,  uint8, uint32, T_UINT8)
 | 
			
		||||
num_ctor(wchar, int32, int32, T_INT32)
 | 
			
		||||
#ifdef BITS64
 | 
			
		||||
num_ctor(long, int64, T_INT64)
 | 
			
		||||
num_ctor(ulong, uint64, T_UINT64)
 | 
			
		||||
num_ctor(long, long, int64, T_INT64)
 | 
			
		||||
num_ctor(ulong, ulong, uint64, T_UINT64)
 | 
			
		||||
#else
 | 
			
		||||
num_ctor(long, int32, T_INT32)
 | 
			
		||||
num_ctor(ulong, uint32, T_UINT32)
 | 
			
		||||
num_ctor(long, long, int32, T_INT32)
 | 
			
		||||
num_ctor(ulong, ulong, uint32, T_UINT32)
 | 
			
		||||
#endif
 | 
			
		||||
num_ctor(float, double, T_FLOAT)
 | 
			
		||||
num_ctor(double, double, T_DOUBLE)
 | 
			
		||||
num_ctor(float, float, double, T_FLOAT)
 | 
			
		||||
num_ctor(double, double, double, T_DOUBLE)
 | 
			
		||||
 | 
			
		||||
value_t size_wrap(size_t sz)
 | 
			
		||||
{
 | 
			
		||||
| 
						 | 
				
			
			@ -313,14 +313,6 @@ size_t toulong(value_t n, char *fname)
 | 
			
		|||
    return 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
value_t char_from_code(uint32_t code)
 | 
			
		||||
{
 | 
			
		||||
    value_t ccode = fixnum(code);
 | 
			
		||||
    if (code > 0x7f)
 | 
			
		||||
        return cvalue_wchar(&ccode, 1);
 | 
			
		||||
    return cvalue_char(&ccode, 1);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void cvalue_enum_init(fltype_t *ft, value_t arg, void *dest)
 | 
			
		||||
{
 | 
			
		||||
    int n=0;
 | 
			
		||||
| 
						 | 
				
			
			@ -457,7 +449,7 @@ static void cvalue_array_init(fltype_t *ft, value_t arg, void *dest)
 | 
			
		|||
static value_t alloc_array(fltype_t *type, size_t sz)
 | 
			
		||||
{
 | 
			
		||||
    value_t cv;
 | 
			
		||||
    if (type->eltype == chartype) {
 | 
			
		||||
    if (type->eltype == bytetype) {
 | 
			
		||||
        cv = cvalue_string(sz);
 | 
			
		||||
    }
 | 
			
		||||
    else {
 | 
			
		||||
| 
						 | 
				
			
			@ -556,7 +548,7 @@ static size_t cvalue_union_size(value_t type, int *palign)
 | 
			
		|||
// *palign is an output argument giving the alignment required by type
 | 
			
		||||
size_t ctype_sizeof(value_t type, int *palign)
 | 
			
		||||
{
 | 
			
		||||
    if (type == int8sym || type == uint8sym || type == charsym) {
 | 
			
		||||
    if (type == int8sym || type == uint8sym || type == bytesym) {
 | 
			
		||||
        *palign = 1;
 | 
			
		||||
        return 1;
 | 
			
		||||
    }
 | 
			
		||||
| 
						 | 
				
			
			@ -672,7 +664,7 @@ static numerictype_t sym_to_numtype(value_t type)
 | 
			
		|||
{
 | 
			
		||||
    if (type == int8sym)
 | 
			
		||||
        return T_INT8;
 | 
			
		||||
    else if (type == uint8sym || type == charsym)
 | 
			
		||||
    else if (type == uint8sym || type == bytesym)
 | 
			
		||||
        return T_UINT8;
 | 
			
		||||
    else if (type == int16sym)
 | 
			
		||||
        return T_INT16;
 | 
			
		||||
| 
						 | 
				
			
			@ -868,7 +860,7 @@ void cvalues_init()
 | 
			
		|||
    ctor_cv_intern(uint32);
 | 
			
		||||
    ctor_cv_intern(int64);
 | 
			
		||||
    ctor_cv_intern(uint64);
 | 
			
		||||
    ctor_cv_intern(char);
 | 
			
		||||
    ctor_cv_intern(byte);
 | 
			
		||||
    ctor_cv_intern(wchar);
 | 
			
		||||
    ctor_cv_intern(long);
 | 
			
		||||
    ctor_cv_intern(ulong);
 | 
			
		||||
| 
						 | 
				
			
			@ -890,7 +882,7 @@ void cvalues_init()
 | 
			
		|||
    // todo: autorelease
 | 
			
		||||
 | 
			
		||||
    stringtypesym = symbol("*string-type*");
 | 
			
		||||
    setc(stringtypesym, list2(arraysym, charsym));
 | 
			
		||||
    setc(stringtypesym, list2(arraysym, bytesym));
 | 
			
		||||
 | 
			
		||||
    wcstringtypesym = symbol("*wcstring-type*");
 | 
			
		||||
    setc(wcstringtypesym, list2(arraysym, wcharsym));
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -904,7 +904,7 @@ static value_t eval_sexpr(value_t e, uint32_t penv, int tail)
 | 
			
		|||
                    v = size_wrap(cvalue_arraylen(Stack[SP-1]));
 | 
			
		||||
                    break;
 | 
			
		||||
                }
 | 
			
		||||
                else if (v == charsym) {
 | 
			
		||||
                else if (v == bytesym) {
 | 
			
		||||
                    v = fixnum(1);
 | 
			
		||||
                    break;
 | 
			
		||||
                }
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -212,7 +212,7 @@ typedef struct {
 | 
			
		|||
#define cv_type(cv)    (cv_class(cv)->type)
 | 
			
		||||
#define cv_data(cv)    ((cv)->data)
 | 
			
		||||
#define cv_numtype(cv) (cv_class(cv)->numtype)
 | 
			
		||||
#define cv_isstr(cv)   (cv_class(cv)->eltype == chartype)
 | 
			
		||||
#define cv_isstr(cv)   (cv_class(cv)->eltype == bytetype)
 | 
			
		||||
 | 
			
		||||
#define cvalue_data(v) cv_data((cvalue_t*)ptr(v))
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -232,11 +232,11 @@ typedef value_t (*builtin_t)(value_t*, uint32_t);
 | 
			
		|||
 | 
			
		||||
extern value_t int8sym, uint8sym, int16sym, uint16sym, int32sym, uint32sym;
 | 
			
		||||
extern value_t int64sym, uint64sym;
 | 
			
		||||
extern value_t longsym, ulongsym, charsym, ucharsym, wcharsym;
 | 
			
		||||
extern value_t longsym, ulongsym, bytesym, wcharsym;
 | 
			
		||||
extern value_t structsym, arraysym, enumsym, cfunctionsym, voidsym, pointersym;
 | 
			
		||||
extern value_t stringtypesym, wcstringtypesym, emptystringsym;
 | 
			
		||||
extern value_t unionsym, floatsym, doublesym, builtinsym;
 | 
			
		||||
extern fltype_t *chartype, *wchartype;
 | 
			
		||||
extern fltype_t *bytetype, *wchartype;
 | 
			
		||||
extern fltype_t *stringtype, *wcstringtype;
 | 
			
		||||
extern fltype_t *builtintype;
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -266,9 +266,9 @@ value_t mk_double(double_t n);
 | 
			
		|||
value_t mk_float(float_t n);
 | 
			
		||||
value_t mk_uint32(uint32_t n);
 | 
			
		||||
value_t mk_uint64(uint64_t n);
 | 
			
		||||
value_t mk_wchar(int32_t n);
 | 
			
		||||
value_t return_from_uint64(uint64_t Uaccum);
 | 
			
		||||
value_t return_from_int64(int64_t Saccum);
 | 
			
		||||
value_t char_from_code(uint32_t code);
 | 
			
		||||
 | 
			
		||||
typedef struct {
 | 
			
		||||
    char *name;
 | 
			
		||||
| 
						 | 
				
			
			@ -279,7 +279,7 @@ void assign_global_builtins(builtinspec_t *b);
 | 
			
		|||
 | 
			
		||||
/* builtins */
 | 
			
		||||
value_t fl_hash(value_t *args, u_int32_t nargs);
 | 
			
		||||
value_t cvalue_char(value_t *args, uint32_t nargs);
 | 
			
		||||
value_t cvalue_byte(value_t *args, uint32_t nargs);
 | 
			
		||||
value_t cvalue_wchar(value_t *args, uint32_t nargs);
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -411,45 +411,28 @@ static void cvalue_printdata(ios_t *f, void *data, size_t len, value_t type,
 | 
			
		|||
{
 | 
			
		||||
    int64_t tmp=0;
 | 
			
		||||
 | 
			
		||||
    if (type == charsym) {
 | 
			
		||||
        // print chars as characters when possible
 | 
			
		||||
    if (type == bytesym) {
 | 
			
		||||
        unsigned char ch = *(unsigned char*)data;
 | 
			
		||||
        if (princ)
 | 
			
		||||
            outc(ch, f);
 | 
			
		||||
        else if (weak)
 | 
			
		||||
            HPOS+=ios_printf(f, "%hhu", ch);
 | 
			
		||||
        else if (isprint(ch))
 | 
			
		||||
            HPOS+=ios_printf(f, "#\\%c", ch);
 | 
			
		||||
            HPOS+=ios_printf(f, "0x%hhx", ch);
 | 
			
		||||
        else
 | 
			
		||||
            HPOS+=ios_printf(f, "#char(%hhu)", ch);
 | 
			
		||||
            HPOS+=ios_printf(f, "#byte(0x%hhx)", ch);
 | 
			
		||||
    }
 | 
			
		||||
    /*
 | 
			
		||||
    else if (type == ucharsym) {
 | 
			
		||||
        uchar ch = *(uchar*)data;
 | 
			
		||||
        if (princ)
 | 
			
		||||
            outc(ch, f);
 | 
			
		||||
        else {
 | 
			
		||||
            if (!weak)
 | 
			
		||||
                ios_printf(f, "#uchar(");
 | 
			
		||||
            ios_printf(f, "%hhu", ch);
 | 
			
		||||
            if (!weak)
 | 
			
		||||
                outs(")", f);
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
    */
 | 
			
		||||
    else if (type == wcharsym) {
 | 
			
		||||
        uint32_t wc = *(uint32_t*)data;
 | 
			
		||||
        char seq[8];
 | 
			
		||||
        if (weak)
 | 
			
		||||
            HPOS+=ios_printf(f, "%d", (int)wc);
 | 
			
		||||
        else if (princ || (iswprint(wc) && wc>0x7f)) {
 | 
			
		||||
            // reader only reads #\c syntax as wchar if the code is >0x7f
 | 
			
		||||
        if (princ || iswprint(wc)) {
 | 
			
		||||
            size_t nb = u8_toutf8(seq, sizeof(seq), &wc, 1);
 | 
			
		||||
            seq[nb] = '\0';
 | 
			
		||||
            // TODO: better multibyte handling
 | 
			
		||||
            if (!princ) outs("#\\", f);
 | 
			
		||||
            outs(seq, f);
 | 
			
		||||
        }
 | 
			
		||||
        else if (weak) {
 | 
			
		||||
            HPOS+=ios_printf(f, "%d", (int)wc);
 | 
			
		||||
        }
 | 
			
		||||
        else {
 | 
			
		||||
            HPOS+=ios_printf(f, "#%s(%d)", symbol_name(type), (int)wc);
 | 
			
		||||
        }
 | 
			
		||||
| 
						 | 
				
			
			@ -544,7 +527,7 @@ static void cvalue_printdata(ios_t *f, void *data, size_t len, value_t type,
 | 
			
		|||
                elsize = ctype_sizeof(eltype, &junk);
 | 
			
		||||
                cnt = elsize ? len/elsize : 0;
 | 
			
		||||
            }
 | 
			
		||||
            if (eltype == charsym) {
 | 
			
		||||
            if (eltype == bytesym) {
 | 
			
		||||
                if (princ) {
 | 
			
		||||
                    ios_write(f, data, len);
 | 
			
		||||
                }
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -189,13 +189,7 @@ static u_int32_t peek(ios_t *f)
 | 
			
		|||
            if (ios_getutf8(f, &cval) == IOS_EOF)
 | 
			
		||||
                lerror(ParseError, "read: end of input in character constant");
 | 
			
		||||
            toktype = TOK_NUM;
 | 
			
		||||
            tokval = fixnum(cval);
 | 
			
		||||
            if (cval > 0x7f) {
 | 
			
		||||
                tokval = cvalue_wchar(&tokval, 1);
 | 
			
		||||
            }
 | 
			
		||||
            else {
 | 
			
		||||
                tokval = cvalue_char(&tokval, 1);
 | 
			
		||||
            }
 | 
			
		||||
            tokval = mk_wchar(cval);
 | 
			
		||||
        }
 | 
			
		||||
        else if ((char)ch == '(') {
 | 
			
		||||
            toktype = TOK_SHARPOPEN;
 | 
			
		||||
| 
						 | 
				
			
			@ -501,7 +495,7 @@ static value_t do_read_sexpr(ios_t *f, value_t label)
 | 
			
		|||
        PUSH(NIL);
 | 
			
		||||
        read_list(f, &Stack[SP-1], UNBOUND);
 | 
			
		||||
        v = POP();
 | 
			
		||||
        return apply(symbol_value(sym), v);
 | 
			
		||||
        return apply(toplevel_eval(sym), v);
 | 
			
		||||
    case TOK_OPENB:
 | 
			
		||||
        return read_vector(f, label, TOK_CLOSEB);
 | 
			
		||||
    case TOK_SHARPOPEN:
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -109,7 +109,7 @@ value_t fl_string(value_t *args, u_int32_t nargs)
 | 
			
		|||
        else if (iscvalue(args[i])) {
 | 
			
		||||
            temp = (cvalue_t*)ptr(args[i]);
 | 
			
		||||
            t = cv_type(temp);
 | 
			
		||||
            if (t == charsym) {
 | 
			
		||||
            if (t == bytesym) {
 | 
			
		||||
                sz++;
 | 
			
		||||
                continue;
 | 
			
		||||
            }
 | 
			
		||||
| 
						 | 
				
			
			@ -136,7 +136,7 @@ value_t fl_string(value_t *args, u_int32_t nargs)
 | 
			
		|||
            temp = (cvalue_t*)ptr(args[i]);
 | 
			
		||||
            t = cv_type(temp);
 | 
			
		||||
            data = cvalue_data(args[i]);
 | 
			
		||||
            if (t == charsym) {
 | 
			
		||||
            if (t == bytesym) {
 | 
			
		||||
                *ptr++ = *(char*)data;
 | 
			
		||||
            }
 | 
			
		||||
            else if (t == wcharsym) {
 | 
			
		||||
| 
						 | 
				
			
			@ -225,7 +225,59 @@ value_t fl_string_char(value_t *args, u_int32_t nargs)
 | 
			
		|||
    size_t sl = u8_seqlen(&s[i]);
 | 
			
		||||
    if (sl > len || i > len-sl)
 | 
			
		||||
        bounds_error("string.char", args[0], args[1]);
 | 
			
		||||
    return char_from_code(u8_nextchar(s, &i));
 | 
			
		||||
    return mk_wchar(u8_nextchar(s, &i));
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static value_t mem_find_byte(char *s, char c, size_t start, size_t len)
 | 
			
		||||
{
 | 
			
		||||
    char *p = memchr(s+start, c, len-start);
 | 
			
		||||
    if (p == NULL)
 | 
			
		||||
        return NIL;
 | 
			
		||||
    return size_wrap((size_t)(p - s));
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
value_t fl_string_find(value_t *args, u_int32_t nargs)
 | 
			
		||||
{
 | 
			
		||||
    char cbuf[8];
 | 
			
		||||
    size_t start = 0;
 | 
			
		||||
    if (nargs == 3)
 | 
			
		||||
        start = toulong(args[2], "string.find");
 | 
			
		||||
    else
 | 
			
		||||
        argcount("string.find", nargs, 2);
 | 
			
		||||
    char *s = tostring(args[0], "string.find");
 | 
			
		||||
    size_t len = cv_len((cvalue_t*)ptr(args[0]));
 | 
			
		||||
    if (start > len)
 | 
			
		||||
        bounds_error("string.find", args[0], args[2]);
 | 
			
		||||
    char *needle=NULL; size_t needlesz=0;
 | 
			
		||||
    if (!iscvalue(args[1]))
 | 
			
		||||
        type_error("string.find", "string", args[1]);
 | 
			
		||||
    cvalue_t *cv = (cvalue_t*)ptr(args[1]);
 | 
			
		||||
    if (isstring(args[1])) {
 | 
			
		||||
        needlesz = cv_len(cv);
 | 
			
		||||
        needle = (char*)cv_data(cv);
 | 
			
		||||
    }
 | 
			
		||||
    else if (cv_class(cv) == wchartype) {
 | 
			
		||||
        uint32_t c = *(uint32_t*)cv_data(cv);
 | 
			
		||||
        if (c <= 0x7f)
 | 
			
		||||
            return mem_find_byte(s, (char)c, start, len);
 | 
			
		||||
        needlesz = u8_toutf8(cbuf, sizeof(cbuf), &c, 1);
 | 
			
		||||
        needle = cbuf;
 | 
			
		||||
    }
 | 
			
		||||
    else if (cv_class(cv) == bytetype) {
 | 
			
		||||
        return mem_find_byte(s, *(char*)cv_data(cv), start, len);
 | 
			
		||||
    }
 | 
			
		||||
    if (needlesz == 0)
 | 
			
		||||
        return fixnum(start);
 | 
			
		||||
    if (needlesz > len-start)
 | 
			
		||||
        return NIL;
 | 
			
		||||
    size_t i;
 | 
			
		||||
    for(i=start; i < len; i++) {
 | 
			
		||||
        if (s[i] == needle[0]) {
 | 
			
		||||
            if (!memcmp(&s[i], needle, needlesz))
 | 
			
		||||
                return size_wrap(i);
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
    return NIL;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
value_t fl_string_inc(value_t *args, u_int32_t nargs)
 | 
			
		||||
| 
						 | 
				
			
			@ -274,6 +326,7 @@ static builtinspec_t stringfunc_info[] = {
 | 
			
		|||
    { "string.length", fl_string_length },
 | 
			
		||||
    { "string.split", fl_string_split },
 | 
			
		||||
    { "string.sub", fl_string_sub },
 | 
			
		||||
    { "string.find", fl_string_find },
 | 
			
		||||
    { "string.char", fl_string_char },
 | 
			
		||||
    { "string.inc", fl_string_inc },
 | 
			
		||||
    { "string.dec", fl_string_dec },
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -87,8 +87,8 @@
 | 
			
		|||
 | 
			
		||||
(define (cadr x) (car (cdr x)))
 | 
			
		||||
 | 
			
		||||
;(setq *special-forms* '(quote cond if and or while lambda label trycatch
 | 
			
		||||
;                        %top progn))
 | 
			
		||||
;(setq *special-forms* '(quote cond if and or while lambda trycatch
 | 
			
		||||
;                        setq progn))
 | 
			
		||||
 | 
			
		||||
(defun macroexpand (e)
 | 
			
		||||
  ((label mexpand
 | 
			
		||||
| 
						 | 
				
			
			@ -101,8 +101,7 @@
 | 
			
		|||
              (cond ((and (consp e)
 | 
			
		||||
                          (not (eq (car e) 'quote)))
 | 
			
		||||
                     (let ((newenv
 | 
			
		||||
                            (if (and (or (eq (car e) 'lambda)
 | 
			
		||||
                                         (eq (car e) 'label))
 | 
			
		||||
                            (if (and (eq (car e) 'lambda)
 | 
			
		||||
                                     (consp (cdr e)))
 | 
			
		||||
                                (append.2 (cadr e) env)
 | 
			
		||||
                              env)))
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -818,7 +818,8 @@ String API
 | 
			
		|||
*string.split   - (string.split s sep-chars)
 | 
			
		||||
 string.trim    - (string.trim s chars-at-start chars-at-end)
 | 
			
		||||
*string.reverse
 | 
			
		||||
 string.find    - (string.find s str|char), or nil if not found
 | 
			
		||||
*string.find    - (string.find s str|char [offs]), or nil if not found
 | 
			
		||||
 string.rfind
 | 
			
		||||
 string.map     - (string.map f s)
 | 
			
		||||
*string.encode  - to utf8
 | 
			
		||||
*string.decode  - from utf8 to UCS
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -114,7 +114,7 @@ void types_init()
 | 
			
		|||
    mk_primtype(uint64);
 | 
			
		||||
    mk_primtype(long);
 | 
			
		||||
    mk_primtype(ulong);
 | 
			
		||||
    mk_primtype(char);
 | 
			
		||||
    mk_primtype(byte);
 | 
			
		||||
    mk_primtype(wchar);
 | 
			
		||||
    mk_primtype(float);
 | 
			
		||||
    mk_primtype(double);
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -64,7 +64,7 @@
 | 
			
		|||
 | 
			
		||||
(assert (equal (uint64 (double -123)) #uint64(0xffffffffffffff85)))
 | 
			
		||||
 | 
			
		||||
(assert (equal (string 'sym #char(65) #wchar(945) "blah") "symA\u03B1blah"))
 | 
			
		||||
(assert (equal (string 'sym #byte(65) #wchar(945) "blah") "symA\u03B1blah"))
 | 
			
		||||
 | 
			
		||||
; this crashed once
 | 
			
		||||
(for 1 10 (lambda (i) 0))
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in New Issue