void InternalProfilerAct::readConfig()

in vm/jitrino/src/codegenerator/ia32/Ia32InternalProfiler.cpp [254:522]


void InternalProfilerAct::readConfig(Config * config) {
    std::string configString;
    std::ifstream configFile;
    const char* fname;
    if ((fname = getArg("config")) == 0)
        fname = "iprof.cfg";
    configFile.open(fname, std::ios::in);

    bool rc = false;
    if (configFile.is_open()) {
        std::string line;
        U_32 ln = 0;
        bool opened = false;
        int num = -1;
        while (std::getline(configFile, line)) {
            ln++;
            if(!line.empty() && (line.find("#")!= 0)) {
                const char * c_line = line.c_str();
                if(std::strstr(c_line, "Config") == c_line) {
                    if(((int)line.find("PrintBBStats") != -1) && ((int)line.find("true")!=-1))
                        config->printBBStats = true;
                } else if (line.find("Counter.") == 0) {
                    if(!opened) {
                        opened = true;
                        num = (int)config->counters.size();
                        config->counters.push_back(Counter());
                        int pos1 = (int)line.find(".");
                        int pos2 = (int)line.find_first_of(".=" , pos1+1);

                        config->counters[num].name =    line.substr(pos1+1, pos2-pos1-1);
                    }
                    if((int)line.find(".Title=")!=-1) {
                        char * val = (char *)std::strstr(line.c_str(),"=")+1;
                        config->counters[num].title=std::string(val);
                    } else if (((int)line.find(".IsOR=")!=-1) && ((int)line.find("true")!=-1)) {
                        config->counters[num].filter.isOR=true;
                    } else if ((int)line.find(std::string(config->counters[num].name)+"=")!=-1) {
                        char * val = (char *)std::strstr(line.c_str(),"=")+1;
                        for(U_32 i = 0; i < config->counters.size(); i++) {
                            if(std::string(config->counters[i].name) == val) {
                                config->counters[num].filter = config->counters[i].filter;
                                break;
                            }
                        }
                    } else if((int)line.find(".Mnemonic")!=-1) {
                        char * mnem = (char *)std::strstr(line.c_str(),"=")+1;
                        if ((std::string(mnem) == "true") && (std::strstr(line.c_str(), "IsNegative"))) {
                            config->counters[num].filter.mnemonic.isNegative=true;
                        } else {
                            config->counters[num].filter.isInitialized=true;
                            config->counters[num].filter.mnemonic.value=EncoderBase::str2mnemonic(mnem);
                            config->counters[num].filter.mnemonic.isInitialized=true;
                        }
                    } else if (std::strstr(line.c_str(), ".OpndNumber")) {
                        char * val = (char *)std::strstr(line.c_str(),"=")+1;
                        if ((std::string(val) == "true") && (std::strstr(line.c_str(), "IsNegative"))) {
                            config->counters[num].filter.operandNumber.isNegative=true;
                        } else {
                            config->counters[num].filter.isInitialized=true;
                            config->counters[num].filter.operandNumber.value=atoi(val);
                            config->counters[num].filter.operandNumber.isInitialized=true;
                        }
                    } else if ((int)line.find(".Operand.") != -1) {
                        char * val = (char *)std::strstr(line.c_str(),"=")+1;
                        int pos = int(line.find(".Operand.")+9);
                        std::string v = line.substr(pos, line.find_first_of(".", pos)-pos);
                        int opNum;
                        if(v == "*")
                            opNum = -1;
                        else 
                            opNum = atoi(v.c_str());
                        config->counters[num].filter.operandFilters[opNum].opNum = opNum;
                        config->counters[num].filter.operandFilters[opNum].isInitialized = true;
                        if ((int)line.find(".OpndRole") != -1) {
                            if ((std::string(val) == "true") && (std::strstr(line.c_str(), "IsNegative"))) {
                                config->counters[num].filter.operandFilters[opNum].opndRole.isNegative=true;
                            } else {
                                config->counters[num].filter.isInitialized=true;
                                config->counters[num].filter.operandFilters[opNum].opndRole.isInitialized=true;
                                for (U_32 i = 0; i<lengthof(opndRoles); i++) {
                                    if(std::string(opndRoles[i].name) == val)
                                        config->counters[num].filter.operandFilters[opNum].opndRole.value=opndRoles[i].value;
                                }
                            }
                        } else if ((int)line.find(".OpndKind") != -1) {
                            if ((std::string(val) == "true") && (std::strstr(line.c_str(), "IsNegative"))) {
                                config->counters[num].filter.operandFilters[opNum].opndKind.isNegative=true;
                            } else {
                                config->counters[num].filter.isInitialized=true;
                                config->counters[num].filter.operandFilters[opNum].opndKind.isInitialized=true;
                                config->counters[num].filter.operandFilters[opNum].opndKind.value=getOpndKind(val);
                            }
                        } else if ((int)line.find(".RegName") != -1) {
                            if ((std::string(val) == "true") && (std::strstr(line.c_str(), "IsNegative"))) {
                                config->counters[num].filter.operandFilters[opNum].opndRole.isNegative=true;
                            } else {
                                config->counters[num].filter.isInitialized=true;
                                config->counters[num].filter.operandFilters[opNum].regName.isInitialized=true;
                                config->counters[num].filter.operandFilters[opNum].regName.value = getRegName(val);
                            }
                        } else if ((int)line.find(".MemOpndKind") != -1) {
                            if ((std::string(val) == "true") && (std::strstr(line.c_str(), "IsNegative"))) {
                                config->counters[num].filter.operandFilters[opNum].memOpndKind.isNegative=true;
                            } else {
                                config->counters[num].filter.isInitialized=true;
                                config->counters[num].filter.operandFilters[opNum].memOpndKind.isInitialized=true;
                                for (U_32 i = 0; i<lengthof(memOpndKinds); i++) {
                                    if(std::string(memOpndKinds[i].name) == val)
                                        config->counters[num].filter.operandFilters[opNum].memOpndKind.value=memOpndKinds[i].value;
                                }
                            }
                        }
                    } else if ((int)line.find(".RuntimeInfo.Kind") != -1) {
                        char * val = (char *)std::strstr(line.c_str(),"=")+1;
                        if ((std::string(val) == "true") && (std::strstr(line.c_str(), "IsNegative"))) {
                            config->counters[num].filter.rtKind.isNegative=true;
                        } else {
                            config->counters[num].filter.isInitialized=true;
                            for (U_32 i = 0; i<lengthof(rtKinds); i++) {
                                if(std::string(rtKinds[i].name) == val)
                                    config->counters[num].filter.rtKind.value=rtKinds[i].value;
                            }
                                //CompilationInterface::str2rid(val);
                            config->counters[num].filter.rtKind.isInitialized=true;
                        }
                    } else if ((int)line.find(".RuntimeInfo.HelperID") != -1) {
                        char * val = (char *)std::strstr(line.c_str(),"=")+1;
                        if ((std::string(val) == "true") && (std::strstr(line.c_str(), "IsNegative"))) {
                            config->counters[num].filter.rtHelperID.isNegative=true;
                        } else {
                            config->counters[num].filter.isInitialized=true;
                            config->counters[num].filter.rtHelperID.value=CompilationInterface::str2rid(val);
                            config->counters[num].filter.rtHelperID.isInitialized=true;
                        }
                    } else if ((int)line.find(".RuntimeInfo.IntHelperName") != -1) {
                        char * val = (char *)std::strstr(line.c_str(),"=")+1;
                        if ((std::string(val) == "true") && (std::strstr(line.c_str(), "IsNegative"))) {
                            config->counters[num].filter.rtIntHelperName.isNegative=true;
                        } else {
                            config->counters[num].filter.isInitialized=true;
                            config->counters[num].filter.rtIntHelperName.value=std::string(val);
                            config->counters[num].filter.rtIntHelperName.isInitialized=true;
                        }
                    } else if ((int)line.find(".isNative") != -1) {
                        char * val = (char *)std::strstr(line.c_str(),"=")+1;
                        if ((std::string(val) == "true") && (std::strstr(line.c_str(), "IsNegative"))) {
                            config->counters[num].filter.isNative.isNegative=true;
                        } else {
                            config->counters[num].filter.isInitialized=true;
                            config->counters[num].filter.isNative.value=(std::string(val) == "true")? true : false;
                            config->counters[num].filter.isNative.isInitialized=true;
                        }
                    } else if ((int)line.find(".isStatic") != -1) {
                        char * val = (char *)std::strstr(line.c_str(),"=")+1;
                        if ((std::string(val) == "true") && (std::strstr(line.c_str(), "IsNegative"))) {
                            config->counters[num].filter.isStatic.isNegative=true;
                        } else {
                            config->counters[num].filter.isInitialized=true;
                            config->counters[num].filter.isStatic.value=(std::string(val) == "true")? true : false;
                            config->counters[num].filter.isStatic.isInitialized=true;
                        }
                    } else if ((int)line.find(".isSynchronized") != -1) {
                        char * val = (char *)std::strstr(line.c_str(),"=")+1;
                        if ((std::string(val) == "true") && (std::strstr(line.c_str(), "IsNegative"))) {
                            config->counters[num].filter.isSynchronized.isNegative=true;
                        } else {
                            config->counters[num].filter.isInitialized=true;
                            config->counters[num].filter.isSynchronized.value=(std::string(val) == "true")? true : false;
                            config->counters[num].filter.isSynchronized.isInitialized=true;
                        }
                    } else if ((int)line.find(".isNoInlining") != -1) {
                        char * val = (char *)std::strstr(line.c_str(),"=")+1;
                        if ((std::string(val) == "true") && (std::strstr(line.c_str(), "IsNegative"))) {
                            config->counters[num].filter.isNoInlining.isNegative=true;
                        } else {
                            config->counters[num].filter.isInitialized=true;
                            config->counters[num].filter.isNoInlining.value=(std::string(val) == "true")? true : false;
                            config->counters[num].filter.isNoInlining.isInitialized=true;
                        }
                    } else if ((int)line.find(".isInstance") != -1) {
                        char * val = (char *)std::strstr(line.c_str(),"=")+1;
                        if ((std::string(val) == "true") && (std::strstr(line.c_str(), "IsNegative"))) {
                            config->counters[num].filter.isInstance.isNegative=true;
                        } else {
                            config->counters[num].filter.isInitialized=true;
                            config->counters[num].filter.isInstance.value=(std::string(val) == "true")? true : false;
                            config->counters[num].filter.isInstance.isInitialized=true;
                        }
                    } else if ((int)line.find(".isFinal") != -1) {
                        char * val = (char *)std::strstr(line.c_str(),"=")+1;
                        if ((std::string(val) == "true") && (std::strstr(line.c_str(), "IsNegative"))) {
                            config->counters[num].filter.isFinal.isNegative=true;
                        } else {
                            config->counters[num].filter.isInitialized=true;
                            config->counters[num].filter.isFinal.value=(std::string(val) == "true")? true : false;
                            config->counters[num].filter.isFinal.isInitialized=true;
                        }
                    } else if ((int)line.find(".isVirtual") != -1) {
                        char * val = (char *)std::strstr(line.c_str(),"=")+1;
                        if ((std::string(val) == "true") && (std::strstr(line.c_str(), "IsNegative"))) {
                            config->counters[num].filter.isVirtual.isNegative=true;
                        } else {
                            config->counters[num].filter.isInitialized=true;
                            config->counters[num].filter.isVirtual.value=(std::string(val) == "true")? true : false;
                            config->counters[num].filter.isVirtual.isInitialized=true;
                        }
                    } else if ((int)line.find(".isAbstract") != -1) {
                        char * val = (char *)std::strstr(line.c_str(),"=")+1;
                        if ((std::string(val) == "true") && (std::strstr(line.c_str(), "IsNegative"))) {
                            config->counters[num].filter.isAbstract.isNegative=true;
                        } else {
                            config->counters[num].filter.isInitialized=true;
                            config->counters[num].filter.isAbstract.value=(std::string(val) == "true")? true : false;
                            config->counters[num].filter.isAbstract.isInitialized=true;
                        }
                    } else if ((int)line.find(".isClassInitializer") != -1) {
                        char * val = (char *)std::strstr(line.c_str(),"=")+1;
                        if ((std::string(val) == "true") && (std::strstr(line.c_str(), "IsNegative"))) {
                            config->counters[num].filter.isClassInitializer.isNegative=true;
                        } else {
                            config->counters[num].filter.isInitialized=true;
                            config->counters[num].filter.isClassInitializer.value=(std::string(val) == "true")? true : false;
                            config->counters[num].filter.isClassInitializer.isInitialized=true;
                        }
                    } else if ((int)line.find(".isInstanceInitializer") != -1) {
                        char * val = (char *)std::strstr(line.c_str(),"=")+1;
                        if ((std::string(val) == "true") && (std::strstr(line.c_str(), "IsNegative"))) {
                            config->counters[num].filter.isInstanceInitializer.isNegative=true;
                        } else {
                            config->counters[num].filter.isInitialized=true;
                            config->counters[num].filter.isInstanceInitializer.value=(std::string(val) == "true")? true : false;
                            config->counters[num].filter.isInstanceInitializer.isInitialized=true;
                        }
                    } else if ((int)line.find(".isStrict") != -1) {
                        char * val = (char *)std::strstr(line.c_str(),"=")+1;
                        if ((std::string(val) == "true") && (std::strstr(line.c_str(), "IsNegative"))) {
                            config->counters[num].filter.isStrict.isNegative=true;
                        } else {
                            config->counters[num].filter.isInitialized=true;
                            config->counters[num].filter.isStrict.value=(std::string(val) == "true")? true : false;
                            config->counters[num].filter.isStrict.isInitialized=true;
                        }
                    } else if ((int)line.find(".isInitLocals") != -1) {
                        char * val = (char *)std::strstr(line.c_str(),"=")+1;
                        if ((std::string(val) == "true") && (std::strstr(line.c_str(), "IsNegative"))) {
                            config->counters[num].filter.isInitLocals.isNegative=true;
                        } else {
                            config->counters[num].filter.isInitialized=true;
                            config->counters[num].filter.isInitLocals.value=(std::string(val) == "true")? true : false;
                            config->counters[num].filter.isInitLocals.isInitialized=true;
                        }
                    }
                } else if (std::strstr(c_line, "[begin]") == c_line) {
                } else if (std::strstr(c_line, "[end]") == c_line) {
                    opened = false;
                } else if (std::strstr(c_line, "#") == c_line) {
                } else {
                    ::std::cerr<<"iprof: BAD LINE("<<ln<<") in configuration file"<<::std::endl;
                    exit(1);
                }
                configString+=line+"\n";
            }
        }
        rc = !configString.empty();
    } 
    if (!rc) {
        ::std::cerr<<"iprof: Can't read configuration"<<::std::endl;
    }
}