コード例 #1
0
void ScriptHandler::setNumVariable( int no, int val )
{
    VariableData &vd = getVariableData(no);
    if ( vd.num_limit_flag ){
        if      ( val < vd.num_limit_lower ) val = vd.num_limit_lower;
        else if ( val > vd.num_limit_upper ) val = vd.num_limit_upper;
    }
    vd.num = val;
}
コード例 #2
0
int ScriptHandler::getIntVariable( VariableInfo *var_info )
{
    if ( var_info == NULL ) var_info = &current_variable;
    
    if ( var_info->type == VAR_INT )
        return getVariableData(var_info->var_no).num;
    else if ( var_info->type == VAR_ARRAY )
        return *getArrayPtr( var_info->var_no, var_info->array, 0 );
    return 0;
}
コード例 #3
0
void ScriptHandler::addStrVariable(char **buf)
{
    (*buf)++;
    int no = parseInt(buf);
    VariableData &vd = getVariableData(no);
    if ( vd.str ){
        for (unsigned int i=0 ; i<strlen( vd.str ) ; i++){
            addStringBuffer( vd.str[i] );
        }
    }
}
コード例 #4
0
void ScriptHandler::addStrVariable(const char** buf)
{
    (*buf)++;
    VariableData &vd = getVariableData(parseInt(buf));
    string_buffer += vd.str;
}
コード例 #5
0
int ScriptHandler::parseInt(const char** buf)
{
    int ret = 0;

    SKIP_SPACE(*buf);

    if (**buf == '%') {
        (*buf)++;
        current_variable.var_no = parseInt(buf);
        current_variable.type = VAR_INT;
        return getVariableData(current_variable.var_no).get_num();
    }
    else if (**buf == '?') {
	array_ref arr = parseArray(buf);
	current_variable.var_no = arr.first;
	current_variable.array = arr.second;
        current_variable.type  = VAR_ARRAY;
	ArrayVariable::iterator i = arrays.find(arr.first);
	if (i != arrays.end()) {
	    if (arr.second.size() < i->second.dimensions())
		arr.second.push_back(0);
	    return i->second.getValue(arr.second);
	}
	return 0;
    }
    else {
        char ch;
	pstring alias_buf;
        int alias_no = 0;
        bool direct_num_flag = false;
        bool num_alias_flag  = false;
        bool hex_num_flag = (*buf)[0] == '0' && (*buf)[1] == 'x';
        if (hex_num_flag) *buf += 2;

        const char* buf_start = *buf;
        while (1) {
            ch = **buf;

            if (hex_num_flag && isaxdigit(ch)) {
                alias_no *= 16;
                if (isadigit(ch)) alias_no += ch - '0';
                else if (isupper(ch)) alias_no += ch - 'A' + 10;
                else alias_no += ch - 'a' + 10;
            }
            else if (isadigit(ch)) {
                if (!num_alias_flag) direct_num_flag = true;

                if (direct_num_flag)
                    alias_no = alias_no * 10 + ch - '0';
                else
                    alias_buf += ch;
            }
            else if (isalpha(ch) || ch == '_') {
                if (ch >= 'A' && ch <= 'Z') ch += 'a' - 'A';

                if (hex_num_flag || direct_num_flag) break;

                num_alias_flag = true;
                alias_buf += ch;
            }
            else break;

            (*buf)++;
        }

        if (*buf - buf_start == 0) {
            current_variable.type = VAR_NONE;
            return 0;
        }

        /* ---------------------------------------- */
        /* Solve num aliases */
        if (num_alias_flag) {

	    numalias_t::iterator a = num_aliases.find(alias_buf);
	    if (a == num_aliases.end()) {
                printf("can't find num alias for %s... assume 0.\n",
		       (const char*) alias_buf);
                current_variable.type = VAR_NONE;
                *buf = buf_start;
                return 0;
	    }
	    else {
		alias_no = a->second;
	    }
        }

        current_variable.type = VAR_INT | VAR_CONST;
        ret = alias_no;
    }

    SKIP_SPACE(*buf);

    return ret;
}
コード例 #6
0
pstring ScriptHandler::parseStr(const char** buf)
{
    SKIP_SPACE(*buf);

    if (**buf == '(') {
        // (foo) bar baz : apparently returns bar if foo has been
        // viewed, baz otherwise.
        // (Rather like a trigram implicitly using "fchk")

        (*buf)++;
        pstring s = parseStr(buf);
        SKIP_SPACE(*buf);
        if ((*buf)[0] != ')') errorAndExit("parseStr: ) is not found.");

        (*buf)++;

        if (file_log.find(s)) {
            s = parseStr(buf);
            parseStr(buf);
        }
        else {
            parseStr(buf);
            s = parseStr(buf);
        }

        current_variable.type |= VAR_CONST;
        return s;
    }
    else if (**buf == '$') {
        (*buf)++;
        int no = parseInt(buf);
        current_variable.type = VAR_STR;
        current_variable.var_no = no;

        return getVariableData(no).str;
    }
    else if (**buf == '"') {
        (*buf)++;
        const char* const start = *buf;
        int len = 0;
        while (**buf != '"' && **buf != 0x0a) {
            ++len;
            (*buf)++;
        }
        if (**buf == '"') (*buf)++;

        current_variable.type |= VAR_CONST;
        return pstring(start, len);
    }
    else if (**buf == file_encoding->TextMarker()) {
        pstring s(file_encoding->TextMarker());
        (*buf)++;

        char ch = **buf;
        while (ch != file_encoding->TextMarker() && ch != 0x0a && ch != '\0') {
            if (file_encoding->UseTags() && ch == '~' && (ch = *++ (*buf)) != '~') {
                while (ch != '~') {
                    int l;
                    s += file_encoding->TranslateTag(*buf, l);
                    *buf += l;
                    ch = **buf;
                }
                ch = *++ (*buf);
                continue;
            }

            int bytes;
            s += file_encoding->Encode(file_encoding->DecodeChar(*buf, bytes));
            *buf += bytes;
            ch = **buf;
        }

        if (**buf == file_encoding->TextMarker()) (*buf)++;

        current_variable.type |= VAR_CONST;
        return s;
    }
    else if (**buf == '#') { // for color
        pstring s(*buf, 7);
        *buf += 7;
        current_variable.type = VAR_NONE;
        return s;
    }
    else if (**buf == '*') { // label
        pstring s(*(*buf)++);
        SKIP_SPACE(*buf);
        char ch = **buf;
        while((ch >= 'a' && ch <= 'z') || (ch >= 'A' && ch <= 'Z') ||
              (ch >= '0' && ch <= '9') || ch == '_') {
            if (ch >= 'A' && ch <= 'Z') ch += 'a' - 'A';
            s += ch;
            ch = *++(*buf);
        }
        current_variable.type |= VAR_CONST | VAR_LABEL;
        return s;
    }
    else { // bareword
        char ch;
        pstring alias_buf;
        bool first_flag = true;

        while (1) {
            ch = **buf;

            if ((ch >= 'a' && ch <= 'z')
                || (ch >= 'A' && ch <= 'Z')
                || ch == '_') {
                if (ch >= 'A' && ch <= 'Z') ch += 'a' - 'A';

                first_flag = false;
                alias_buf += ch;
            }
            else if (ch >= '0' && ch <= '9') {
                if (first_flag)
                  errorAndExit("parseStr: number is not allowed for the "
                      "first letter of str alias.");

                first_flag = false;
                alias_buf += ch;
            }
            else break;

            (*buf)++;
        }

        if (!alias_buf) {
            current_variable.type = VAR_NONE;
            return "";
        }

	stralias_t::iterator a = str_aliases.find(alias_buf);
	if (a == str_aliases.end()) {
            current_variable.type = VAR_NONE;
	    return alias_buf;
	}

        current_variable.type |= VAR_CONST;
	return a->second;
    }
}
コード例 #7
0
int ScriptHandler::parseInt( char **buf )
{
    int ret = 0;
    
    SKIP_SPACE( *buf );

    if ( **buf == '%' ){
        (*buf)++;
        current_variable.var_no = parseInt(buf);
        current_variable.type = VAR_INT;
        return getVariableData(current_variable.var_no).num;
    }
    else if ( **buf == '?' ){
        ArrayVariable av;
        current_variable.var_no = parseArray( buf, av );
        current_variable.type = VAR_ARRAY;
        current_variable.array = av;
        return *getArrayPtr( current_variable.var_no, current_variable.array, 0 );
    }
    else{
        char ch, alias_buf[256];
        int alias_buf_len = 0, alias_no = 0;
        bool direct_num_flag = false;
        bool num_alias_flag = false;

        char *buf_start = *buf;
        while( 1 ){
            ch = **buf;
            
            if ( (ch >= 'a' && ch <= 'z') || 
                 (ch >= 'A' && ch <= 'Z') || 
                 ch == '_' ){
                if (ch >= 'A' && ch <= 'Z') ch += 'a' - 'A';
                if ( direct_num_flag ) break;
                num_alias_flag = true;
                alias_buf[ alias_buf_len++ ] = ch;
            }
            else if ( ch >= '0' && ch <= '9' ){
                if ( !num_alias_flag ) direct_num_flag = true;
                if ( direct_num_flag ) 
                    alias_no = alias_no * 10 + ch - '0';
                else
                    alias_buf[ alias_buf_len++ ] = ch;
            }
            else break;
            (*buf)++;
        }

        if ( *buf - buf_start  == 0 ){
            current_variable.type = VAR_NONE;
            return 0;
        }
        
        /* ---------------------------------------- */
        /* Solve num aliases */
        if ( num_alias_flag ){
            alias_buf[ alias_buf_len ] = '\0';
            Alias *p_num_alias = root_num_alias.next;

            while( p_num_alias ){
                if ( !strcmp( p_num_alias->alias,
                              (const char*)alias_buf ) ){
                    alias_no = p_num_alias->num;
                    break;
                }
                p_num_alias = p_num_alias->next;
            }
            if ( !p_num_alias ){
                //printf("can't find num alias for %s... assume 0.\n", alias_buf );
                current_variable.type = VAR_NONE;
                *buf = buf_start;
                return 0;
            }
        }
        current_variable.type = VAR_INT | VAR_CONST;
        ret = alias_no;
    }

    SKIP_SPACE( *buf );

    return ret;
}
コード例 #8
0
void ScriptHandler::parseStr( char **buf )
{
    SKIP_SPACE( *buf );

    if ( **buf == '(' ){
        (*buf)++;
        parseStr(buf);
        SKIP_SPACE( *buf );
        if ( (*buf)[0] != ')' ) errorAndExit("parseStr: missing ')'.");
        (*buf)++;

        if ( findAndAddLog( log_info[FILE_LOG], str_string_buffer, false ) ){
            parseStr(buf);
            char *tmp_buf = new char[ strlen( str_string_buffer ) + 1 ];
            strcpy( tmp_buf, str_string_buffer );
            parseStr(buf);
            strcpy( str_string_buffer, tmp_buf );
            delete[] tmp_buf;
        }
        else{
            parseStr(buf);
            parseStr(buf);
        }
        current_variable.type |= VAR_CONST;
    }
    else if ( **buf == '$' ){
        (*buf)++;
        int no = parseInt(buf);
        VariableData &vd = getVariableData(no);

        if ( vd.str )
            strcpy( str_string_buffer, vd.str );
        else
            str_string_buffer[0] = '\0';
        current_variable.type = VAR_STR;
        current_variable.var_no = no;
    }
    else if ( **buf == '"' ){
        int c=0;
        (*buf)++;
        while ( **buf != '"' && **buf != 0x0a )
            str_string_buffer[c++] = *(*buf)++;
        str_string_buffer[c] = '\0';
        if ( **buf == '"' ) (*buf)++;
        current_variable.type |= VAR_CONST;
    }
#ifdef ENABLE_1BYTE_CHAR
    else if ( **buf == '`' ){
        int c=0;
        str_string_buffer[c++] = *(*buf)++;
        while ( **buf != '`' && **buf != 0x0a )
            str_string_buffer[c++] = *(*buf)++;
        str_string_buffer[c] = '\0';
        if ( **buf == '`' ) (*buf)++;
        current_variable.type |= VAR_CONST;
        end_status |= END_1BYTE_CHAR;
    }
#endif    
    else if ( **buf == '#' ){ // for color
        for ( int i=0 ; i<7 ; i++ )
            str_string_buffer[i] = *(*buf)++;
        str_string_buffer[7] = '\0';
        current_variable.type = VAR_NONE;
    }
    else if ( **buf == '*' ){ // label
        int c=0;
        str_string_buffer[c++] = *(*buf)++;
        SKIP_SPACE(*buf);
        char ch = **buf;
        while((ch >= 'a' && ch <= 'z') || 
              (ch >= 'A' && ch <= 'Z') ||
              (ch >= '0' && ch <= '9') ||
              ch == '_'){
            if (ch >= 'A' && ch <= 'Z') ch += 'a' - 'A';
            str_string_buffer[c++] = ch;
            ch = *++(*buf);
        }
        str_string_buffer[c] = '\0';
        current_variable.type |= VAR_CONST;
    }
    else{ // str alias
        char ch, alias_buf[512];
        int alias_buf_len = 0;
        bool first_flag = true;
        
        while(1){
            if ( alias_buf_len == 511 ) break;
            ch = **buf;
            
            if ( (ch >= 'a' && ch <= 'z') || 
                 (ch >= 'A' && ch <= 'Z') || 
                 ch == '_' ){
                if (ch >= 'A' && ch <= 'Z') ch += 'a' - 'A';
                first_flag = false;
                alias_buf[ alias_buf_len++ ] = ch;
            }
            else if ( ch >= '0' && ch <= '9' ){
                if ( first_flag ) errorAndExit("parseStr: number is not allowed for the first letter of str alias.");
                first_flag = false;
                alias_buf[ alias_buf_len++ ] = ch;
            }
            else break;
            (*buf)++;
        }
        alias_buf[alias_buf_len] = '\0';
        
        if ( alias_buf_len == 0 ){
            str_string_buffer[0] = '\0';
            current_variable.type = VAR_NONE;
            return;
        }
        
        Alias *p_str_alias = root_str_alias.next;

        while( p_str_alias ){
            if ( !strcmp( p_str_alias->alias, (const char*)alias_buf ) ){
                strcpy( str_string_buffer, p_str_alias->str );
                break;
            }
            p_str_alias = p_str_alias->next;
        }
        if ( !p_str_alias ){
            printf("can't find str alias for %s...\n", alias_buf );
            exit(-1);
        }
        current_variable.type |= VAR_CONST;
    }
}