int parse_bitoperand( char **str, struct rule *rule ) { char *p = rule->operands[rule->operand_count].name; if( rule->operand_count == MAX_OPERANDS ) { fprintf( stderr, "Maximum operands/rule exceeded (%d) at line %d\n", MAX_OPERANDS, yyline ); return -1; } while( isalnum(**str) || **str == '_' ) { *p++ = *(*str)++; } *p = '\0'; CONSUME_CHAR(':'); int size = parse_integer( str ); if( size == -1 ) { return -1; } rule->operands[rule->operand_count].bit_count = size; if( **str == 's' || **str == 'S' ) { (*str)++; rule->operands[rule->operand_count].is_signed = 1; } else if( **str == 'u' || **str == 'U' ) { (*str)++; rule->operands[rule->operand_count].is_signed = 0; } if( **str == '<' ) { (*str)++; CONSUME_CHAR('<'); int lsl = parse_integer(str); if( lsl == -1 ) { return -1; } rule->operands[rule->operand_count].left_shift = lsl; } CONSUME_CHAR(')'); rule->operands[rule->operand_count].bit_shift = rule->bit_count; rule->bit_count += size; rule->bits = rule->bits << size; rule->mask = rule->mask << size; rule->operand_count++; return 0; }
QStringList StringHandler::unparseStrings(QString value) { QStringList lst; value = value.trimmed(); if (value[0] != '{') return lst; // ERROR? int i=1; QString res; while (value[i] == '"') { i++; while (value.at(i) != '"') { CONSUME_CHAR(value,res,i); i++; /* if we have unexpected double quotes then, however omc should return \" */ /* remove this block once fixed in omc */ if (value[i] == '"' && value[i+1] != ',') { if (value[i+1] != '}') { CONSUME_CHAR(value,res,i); i++; } } /* remove this block once fixed in omc */ } i++; if (value[i] == '}') { lst.append(res); return lst; } if (value[i] == ',') { lst.append(res); i++; res = ""; while (value[i] == ' ') // if we have space before next value e.g {"x", "y", "z"} i++; continue; } while (value[i] != '"' && value[i] != '\0') { i++; fprintf(stderr, "error? malformed string-list. skipping: %c\n", value[i].toAscii()); } } return lst; // ERROR? }
QString StringHandler::unparse(QString value) { QString res; value = value.trimmed(); if (value.length() > 1 && value.at(0) == '\"' && value.at(value.length() - 1) == '\"') { value = value.mid(1, (value.length() - 2)); for (int i=0; i < value.length(); i++) { CONSUME_CHAR(value,res,i); } return res; } else { return ""; } }