char *MYRTLEXP StrCase( char *str,msCaseTypes type ) { int n; if ( !str || *str == 0 ) return str; switch( type ){ case mscLower: StrLwr( str ); break; case mscUpper: StrUpr( str ); break; case mscCapitalize: StrLwr( str ); str[0] = ToUpper(str[0]); break; case mscUpLower: for ( n = 0; str[n]; n++ ) if ( isLower(str[n]) ) return str; return StrCase( str,mscLower ); case mscLoUpper: for ( n = 0; str[n]; n++ ) if ( isUpper(str[n]) ) return str; return StrCase( str,mscUpper ); case mscInvert: for ( n = 0; str[n]; n++ ) if ( isUpper(str[n]) ) str[n] = ToLower(str[n]); else str[n] = ToUpper(str[n]); break; } return str; }
int CLabel::SearchLocal( char *oname, char *loname ) { // object name search ( for local ) // int hash, hash2; if (cur == 0) return -1; hash = StrCase(oname); hash2 = GetHash(loname); if (*oname != 0) { std::pair<LabelMap::iterator, LabelMap::iterator> r = labels.equal_range( oname ); for(LabelMap::iterator it = r.first; it != r.second; ++it) { LABOBJ *lab = mem_lab + it->second; if (lab->flag >= 0 && lab->eternal) { return it->second; } } std::pair<LabelMap::iterator, LabelMap::iterator> r2 = labels.equal_range( loname ); for(LabelMap::iterator it = r2.first; it != r2.second; ++it) { LABOBJ *lab = mem_lab + it->second; if (lab->flag >= 0 && !lab->eternal) { return it->second; } } } return -1; }
int CLabel::Regist( char *name, int type, int opt, char const *filename, int line ) { if ( name[0]==0 ) return -1; if ( cur>=maxlab ) { // ラベルバッファ拡張 LABOBJ *tmp; int i,oldsize; oldsize = sizeof(LABOBJ)*maxlab; maxlab += def_maxlab; tmp = (LABOBJ *)malloc( sizeof(LABOBJ)*maxlab ); for(i=0;i<maxlab;i++) { tmp[i].flag = -1; } memcpy( (char *)tmp, (char *)mem_lab, oldsize ); free( mem_lab ); mem_lab = tmp; } int label_id = cur; LABOBJ *lab=&mem_lab[cur++]; lab->flag = 1; lab->type = type; lab->opt = opt; lab->eternal = 0; lab->ref = 0; lab->name = RegistSymbol( name ); lab->data = NULL; lab->data2 = NULL; lab->hash = StrCase( lab->name ); lab->rel = NULL; lab->init = LAB_INIT_NO; lab->typefix = LAB_TYPEFIX_NONE; SetDefinition(label_id, filename, line); labels.insert(std::make_pair(lab->name, label_id)); return label_id; }
int CLabel::Search( char *oname ) { // object name search // if (cur==0) return -1; //int hash = StrCase( oname ); if (*oname != 0) { std::pair<LabelMap::iterator, LabelMap::iterator> r = labels.equal_range( oname ); for(LabelMap::iterator it = r.first; it != r.second; ++it) { LABOBJ *lab = mem_lab + it->second; if ( lab->flag >= 0 ) { return it->second; } } } return -1; }