示例#1
0
static SQInteger _string_escape(HSQUIRRELVM v)
{
	const SQChar *str;
	SQChar *dest,*resstr;
	SQInteger size;
	sq_getstring(v,2,&str);
	size = sq_getsize(v,2);
	if(size == 0) {
		sq_push(v,2);
		return 1;
	}
	SQInteger destcharsize = (size * 6); //assumes every char could be escaped
	resstr = dest = (SQChar *)sq_getscratchpad(v,destcharsize * sizeof(SQChar));
	SQChar c;
	SQChar escch;
	SQInteger escaped = 0;
	for(int n = 0; n < size; n++){
		c = *str++;
		escch = 0;
		if(scisprint(c) || c == 0) {
			switch(c) {
			case '\a': escch = 'a'; break;
			case '\b': escch = 'b'; break;
			case '\t': escch = 't'; break;
			case '\n': escch = 'n'; break;
			case '\v': escch = 'v'; break;
			case '\f': escch = 'f'; break;
			case '\r': escch = 'r'; break;
			case '\\': escch = '\\'; break;
			case '\"': escch = '\"'; break;
			case '\'': escch = '\''; break;
			case 0: escch = '0'; break;
			}
			if(escch) {
				*dest++ = '\\';
				*dest++ = escch;
				escaped++;
			}
			else {
				*dest++ = c;
			}
		}
		else {
			dest += scsprintf(dest,destcharsize,_SC("\\x%x"),c);
			escaped++;
		}
	}

	if(escaped) {
		sq_pushstring(v,resstr,dest - resstr);
	}
	else {
		sq_push(v,2); //nothing escaped
	}
	return 1;
}
示例#2
0
static SQInteger _string_escape(HSQUIRRELVM v)
{
    const SQChar *str;
    SQChar *dest,*resstr;
    SQInteger size;
    sq_getstring(v,2,&str);
    size = sq_getsize(v,2);
    if(size == 0) {
        sq_push(v,2);
        return 1;
    }
#ifdef SQUNICODE
#if WCHAR_SIZE == 2
    const SQChar *escpat = _SC("\\x%04x");
    const SQInteger maxescsize = 6;
#else //WCHAR_SIZE == 4
    const SQChar *escpat = _SC("\\x%08x");
    const SQInteger maxescsize = 10;
#endif
#else
    const SQChar *escpat = _SC("\\x%02x");
    const SQInteger maxescsize = 4;
#endif
    SQInteger destcharsize = (size * maxescsize); //assumes every char could be escaped
    resstr = dest = (SQChar *)sq_getscratchpad(v,destcharsize * sizeof(SQChar));
    SQChar c;
    SQChar escch;
    SQInteger escaped = 0;
    for(int n = 0; n < size; n++){
        c = *str++;
        escch = 0;
        if(scisprint(c) || c == 0) {
            switch(c) {
            case '\a': escch = 'a'; break;
            case '\b': escch = 'b'; break;
            case '\t': escch = 't'; break;
            case '\n': escch = 'n'; break;
            case '\v': escch = 'v'; break;
            case '\f': escch = 'f'; break;
            case '\r': escch = 'r'; break;
            case '\\': escch = '\\'; break;
            case '\"': escch = '\"'; break;
            case '\'': escch = '\''; break;
            case 0: escch = '0'; break;
            }
            if(escch) {
                *dest++ = '\\';
                *dest++ = escch;
                escaped++;
            }
            else {
                *dest++ = c;
            }
        }
        else {

            dest += scsprintf(dest, destcharsize, escpat, c);
            escaped++;
        }
    }

    if(escaped) {
        sq_pushstring(v,resstr,dest - resstr);
    }
    else {
        sq_push(v,2); //nothing escaped
    }
    return 1;
}