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; }
int ScriptHandler::getIntVariable( VariableInfo *var_info ) { if ( var_info == NULL ) var_info = ¤t_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; }
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] ); } } }
void ScriptHandler::addStrVariable(const char** buf) { (*buf)++; VariableData &vd = getVariableData(parseInt(buf)); string_buffer += vd.str; }
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; }
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; } }
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; }
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; } }