示例#1
0
文件: ProcFS.cpp 项目: cosql/ds2
bool ProcFS::ReadProcessIds(pid_t pid, pid_t &ppid, uid_t &uid, uid_t &euid,
                            gid_t &gid, gid_t &egid) {
  FILE *fp = OpenFILE(pid, "status");
  if (fp == nullptr)
    return false;

  ParseKeyValue(fp, 1024, ':', [&](char const *key, char const *value) -> bool {
    char *eptr;
    if (strcmp(key, "PPid") == 0) {
      ppid = std::strtol(value, nullptr, 0);
    } else if (strcmp(key, "Uid") == 0) {
      // Real Effective
      uid = std::strtol(value, &eptr, 0);
      euid = std::strtol(eptr, &eptr, 0);
    } else if (strcmp(key, "Gid") == 0) {
      // Real Effective
      gid = std::strtol(value, &eptr, 0);
      egid = std::strtol(eptr, &eptr, 0);
      return false; // We're done, stop reading.
    }

    return true;
  });

  std::fclose(fp);
  return true;
}
示例#2
0
bool CConfigFile::LoadFromFile(const string& sFileName, bool bHideError /*= false*/)
{
	bool bResult = false;

	do
	{
		ifstream fin( sFileName.c_str() );
		if (!fin.is_open())
		{
			if (bHideError)
			{
				LOG_ERROR(g_szEFileOpen, sFileName.c_str());
			}
			break;
		}

		string sFileLine, sTag, sValue;
		CSectionData* pSubMap = NULL;
		while( !fin.eof() && fin.good() )
		{
			getline( fin, sFileLine );
			if( sFileLine.empty()  || sFileLine[0] == COMMENT_BEGIN ) continue;
			if( sFileLine[0] == LEFT_BRACKET )
			{
				//StrUtils::RemoveBrackets( sFileLine, '[', ']' );
				RemoveBrackets(sFileLine);

				CIniSettingStorage::const_iterator itMap = m_issStorage.find( sFileLine );
				if( itMap == m_issStorage.end() ) 
				{
					pSubMap = new CSectionData;
					m_issStorage.insert( CIniSettingStorage::value_type(sFileLine, pSubMap) );
				}
				else
				{
					pSubMap = itMap->second;
				}
				continue;
			}

			if (pSubMap)
			{
				ParseKeyValue(sFileLine, sTag, sValue);

				if( !sTag.empty() )
				{
					(*pSubMap)[ sTag ] = sValue;
				}
			}		
		}

		bResult = true;
	}
	while(false);

	return bResult;
}
示例#3
0
文件: ProcFS.cpp 项目: cosql/ds2
pid_t ProcFS::GetProcessParentPid(pid_t pid) {
  FILE *fp = OpenFILE(pid, "status");
  if (fp == nullptr)
    return 0;

  pid_t ppid = 0;
  ParseKeyValue(fp, 1024, ':', [&](char const *key, char const *value) -> bool {
    if (strcmp(key, "PPid") == 0) {
      ppid = std::strtol(value, nullptr, 0);
      return false;
    }
    return true;
  });

  std::fclose(fp);
  return ppid;
}
示例#4
0
extern void
CommandRelationalSetup(char *sz)
{
    char *apch[2];

    if (ParseKeyValue(&sz, apch)) {
        if (!StrCaseCmp(apch[0], "dbtype"))
            SetDBType(apch[1]);
        if (!StrCaseCmp(apch[0], "storegamestats"))
            storeGameStats = !StrCaseCmp(apch[1], "yes");
        else {
            char *pc = apch[0];
            char *db = NextTokenGeneral(&pc, "-");
            SetDBParam(db, pc, apch[1]);
        }
    }
}
示例#5
0
文件: ProcFS.cpp 项目: cosql/ds2
std::string ProcFS::GetThreadName(pid_t pid, pid_t tid) {
  std::string thread_name;
  FILE *fp;

  fp = ProcFS::OpenFILE(pid, tid, "status");
  if (fp == nullptr)
    return std::string();

  ParseKeyValue(fp, 1024, ':', [&](char const *key, char const *value) -> bool {
    if (strcmp(key, "Name") == 0) {
      thread_name = value;
      return false; // We're done, stop reading.
    }

    return true;
  });

  std::fclose(fp);
  return thread_name;
}
/** Load an OEM file and convert it to an STA Space Scenario.
  *
  * Not all features of the OEM format are supported by the OemImporter
  * class. An oem file that uses an unsupported feature will fail to load;
  * details of the problem are available via the errorMessage() method.
  *
  * The current implementation has the following limitations:
  *   - TIME_STANDARD must be TDB
  *   - REF_FRAME must be EME2000 or ECLIP2000
  *   - CENTER_NAME must be an object with an ephemeris
  *
  * \return a pointer to a complete space scenario, or NULL if
  * there was an error loading the scenario.
  */
SpaceScenario*
OemImporter::loadScenario()
{
    readHeader();
    SpaceScenario* scenario = new SpaceScenario();
    scenario->setName("New scenario");

    QSharedPointer<ScenarioSC> sc(new ScenarioSC());
    scenario->AbstractParticipant().append(sc);

    ScenarioExternalType* trajectory;

    bool skip = false;
    QString line;

    QString objectName;
    StaBody* center = NULL;
    sta::CoordinateSystemType coordSys = sta::COORDSYS_INVALID;

    QRegExp whiteSpaceRegExp("\\s+");


    // This is the state machine for parsing OEM files. Roughly, the structure
    // of an OEM file is:
    //    Header
    //
    //    Metadata
    //    Ephemeris data
    //    Metadata
    //    Ephemeris data
    //    ...
    //
    // Where the metadata and ephemeris data blocks alternate; any number
    // of metadata/ephemeris data pairs may appear in the file. For full
    // details see Recommended Standard CCSDS 502.0-B-2.
    while (m_parserState != Oem_End && m_parserState != Oem_Error)
    {
        if (skip)
        {
            skip = false;
        }
        else
        {
            line = m_stream->readLine().trimmed();
            m_lineNumber++;
        }

        if (m_stream->atEnd())
        {
            m_parserState = Oem_End;
        }
        else if (line.isEmpty())
        {
            // Nothing to do
        }
        else
        {
            switch (m_parserState)
            {
            case Oem_Begin:
                {
                    OemKeyValue kv = ParseKeyValue(line);
                    if (kv.key == "CCSDS_OEM_VERS")
                    {
                        m_parserState = Oem_AfterVersion;
                    }
                    else
                    {
                        raiseError("Version expected in header");
                    }
                }
                break;

            case Oem_AfterVersion:
                if (line.startsWith("COMMENT"))
                {
                    // Skip and do nothing
                }
                else
                {
                    OemKeyValue kv = ParseKeyValue(line);
                    if (kv.key == "CREATION_DATE")
                    {
                        m_parserState = Oem_AfterCreationDate;
                    }
                    else
                    {
                        raiseError("Creation date expected in header");
                    }
                }
                break;

            case Oem_AfterCreationDate:
                {
                    OemKeyValue kv = ParseKeyValue(line);
                    if (kv.key == "ORIGINATOR")
                    {
                        m_parserState = Oem_AfterHeader;
                    }
                    else
                    {
                        raiseError("Creation date expected in header");
                    }
                }
                break;

            case Oem_AfterHeader:
                if (line.startsWith("COMMENT"))
                {
                    // Skip and do nothing
                }
                else if (line == "META_START")
                {
                    m_parserState = Oem_MetaStart;
                }
                else
                {
                    raiseError("Metadata block expected");
                }
                break;

            case Oem_MetaStart:
                {
                    OemKeyValue kv = ParseKeyValue(line);
                    if (kv.key == "OBJECT_NAME")
                    {
                        m_parserState = Oem_AfterObjectName;
                        objectName = kv.value;
                    }
                    else
                    {
                        raiseError("Object name expected");
                    }
                }
                break;

            case Oem_AfterObjectName:
                {
                    OemKeyValue kv = ParseKeyValue(line);
                    if (kv.key == "OBJECT_ID")
                    {
                        m_parserState = Oem_AfterObjectId;
                    }
                    else
                    {
                        raiseError("Object ID expected");
                    }
                }
                break;

            case Oem_AfterObjectId:
                {
                    OemKeyValue kv = ParseKeyValue(line);
                    if (kv.key == "CENTER_NAME")
                    {
                        m_parserState = Oem_AfterCenterName;
                        center = STA_SOLAR_SYSTEM->lookup(kv.value);
                        if (!center)
                        {
                            raiseError("Unknown central body " + kv.value);
                        }
                    }
                    else
                    {
                        raiseError("Center name expected");
                    }
                }
                break;

            case Oem_AfterCenterName:
                {
                    OemKeyValue kv = ParseKeyValue(line);
                    if (kv.key == "REF_FRAME")
                    {
                        m_parserState = Oem_AfterRefFrame;
                        if (kv.value == "EME2000")
                        {
                            coordSys = sta::COORDSYS_EME_J2000;
                        }
                        else if (kv.value == "ECLIP2000")
                        {
                            coordSys = sta::COORDSYS_ECLIPTIC_J2000;
                        }
                        else
                        {
                            raiseError("Unsupported reference frame " + kv.value);
                        }
                    }
                    else
                    {
                        raiseError("Reference frame expected");
                    }
                }
                break;

            case Oem_AfterRefFrame:
                {
                    OemKeyValue kv = ParseKeyValue(line);
                    if (kv.key == "REF_FRAME_EPOCH")
                    {
                    }
                    else
                    {
                        skip = true;
                    }
                    m_parserState = Oem_AfterRefFrameEpoch;
                }
                break;

            case Oem_AfterRefFrameEpoch:
                {
                    OemKeyValue kv = ParseKeyValue(line);
                    if (kv.key == "TIME_SYSTEM")
                    {
                        m_parserState = Oem_AfterTimeSystem;
                        if (kv.value != "TDB")
                        {
                            raiseError("Unsupported time system " + kv.value);
                        }
                    }
                    else
                    {
                        raiseError("Time system expected");
                    }
                }
                break;

            case Oem_AfterTimeSystem:
                {
                    OemKeyValue kv = ParseKeyValue(line);
                    if (kv.key == "START_TIME")
                    {
                        m_parserState = Oem_AfterStartTime;
                    }
                    else
                    {
                        raiseError("Start time expected");
                    }
                }
                break;

            case Oem_AfterStartTime:
                {
                    OemKeyValue kv = ParseKeyValue(line);
                    if (kv.key == "USEABLE_START_TIME")
                    {
                    }
                    else
                    {
                        skip = true;
                    }
                    m_parserState = Oem_AfterUseableStartTime;
                }
                break;

            case Oem_AfterUseableStartTime:
                {
                    OemKeyValue kv = ParseKeyValue(line);
                    if (kv.key == "USEABLE_STOP_TIME")
                    {
                    }
                    else
                    {
                        skip = true;
                    }
                    m_parserState = Oem_AfterUseableStopTime;
                }
                break;

            case Oem_AfterUseableStopTime:
                {
                    OemKeyValue kv = ParseKeyValue(line);
                    if (kv.key == "STOP_TIME")
                    {
                        m_parserState = Oem_AfterStopTime;
                    }
                    else
                    {
                        raiseError("Stop time expected");
                    }
                }
                break;

            case Oem_AfterStopTime:
                {
                    OemKeyValue kv = ParseKeyValue(line);
                    if (kv.key == "INTERPOLATION")
                    {
                    }
                    else
                    {
                        skip = true;
                    }
                    m_parserState = Oem_AfterInterpolation;
                }
                break;

            case Oem_AfterInterpolation:
                {
                    OemKeyValue kv = ParseKeyValue(line);
                    if (kv.key == "INTERPOLATION_DEGREE")
                    {
                    }
                    else
                    {
                        skip = true;
                    }
                    m_parserState = Oem_AfterInterpolationDegree;
                }
                break;

            case Oem_AfterInterpolationDegree:
                if (line == "META_STOP")
                {
                    m_parserState = Oem_AfterMetaStop;
                    trajectory = new ScenarioExternalType();

                    int trajectoryIndex = sc->SCMission()->TrajectoryPlan()->AbstractTrajectory().size();

                    trajectory->CentralBody()->setName(center->name());
                    trajectory->setCoordinateSystem(sta::CoordinateSystem(coordSys).name());
                    trajectory->ElementIdentifier()->setName(QString("%1 - %2").arg(objectName).arg(trajectoryIndex + 1));
                    trajectory->ElementIdentifier()->setColorName("Yellow");

                    sc->SCMission()->TrajectoryPlan()->AbstractTrajectory().append(QSharedPointer<ScenarioAbstractTrajectoryType>(trajectory));
                }
                else
                {
                    raiseError("End of metadata (META_STOP) expected");
                }
                break;

            case Oem_AfterMetaStop:
                if (line.startsWith("COMMENT"))
                {
                    // Ignore the comment
                }
                else
                {
                    skip = true;
                    m_parserState = Oem_EphemerisData;
                }
                break;

            case Oem_EphemerisData:
                if (line == "META_START")
                {
                    m_parserState = Oem_MetaStart;
                }
                else
                {
                    // Parse the ephemeris line
                    QStringList values = line.split(whiteSpaceRegExp);
                    if (values.size() != 7)
                    {
                        raiseError("Bad or unsupported ephemeris data record");
                    }
                    else
                    {
                        QDateTime dateTime;
                        int secondsDecimal = values[0].lastIndexOf('.');
                        if (secondsDecimal > 0)
                        {
                            bool msecOk = false;
                            double sec = values[0].right(values[0].length() - secondsDecimal).toDouble(&msecOk);
                            if (msecOk)
                            {
                                dateTime = QDateTime::fromString(values[0].left(secondsDecimal), Qt::ISODate);
                                dateTime.setTimeSpec(Qt::UTC);
                                int msec = (int) (sec * 1000.0);
                                dateTime = dateTime.addMSecs((int) (sec * 1000.0));
                            }
                        }
                        else
                        {
                            dateTime = QDateTime::fromString(values[0], Qt::ISODate);
                        }

                        if (!dateTime.isValid())
                        {
                            raiseError(QString("Bad time value in ephemeris data (%1)").arg(values[0]));
                        }
                        else
                        {
                            bool stateValid = true;
                            double state[6];
                            for (int i = 0; i < 6; ++i)
                            {
                                bool ok = false;
                                state[i] = values[i + 1].toDouble(&ok);
                                if (!ok)
                                {
                                    stateValid = false;
                                }
                            }

                            if (!stateValid)
                            {
                                raiseError("Non-number in ephemeris data");
                            }
                            else
                            {
                                trajectory->TimeTags().append(dateTime);
                                for (int i = 0; i < 6; ++i)
                                {
                                    trajectory->States() << state[i];
                                }
                            }
                        }
                    }
                }
                break;

            default:
                m_parserState = Oem_Error;
                break;
            }
        }
    }

    // Validate trajectory by making sure that there are no overlapping segments or gaps
    if (sc)
    {
        for (int i = 1; i < sc->SCMission()->TrajectoryPlan()->AbstractTrajectory().size(); ++i)
        {
            ScenarioExternalType* prev = dynamic_cast<ScenarioExternalType*>(sc->SCMission()->TrajectoryPlan()->AbstractTrajectory().at(i - 1).data());
            ScenarioExternalType* curr = dynamic_cast<ScenarioExternalType*>(sc->SCMission()->TrajectoryPlan()->AbstractTrajectory().at(i).data());
            if (prev && curr && !prev->TimeTags().isEmpty() && !curr->TimeTags().isEmpty())
            {
                QDateTime prevEnd = prev->TimeTags().last();
                QDateTime currStart = curr->TimeTags().first();
                if (currStart < prevEnd)
                {
                    raiseError(QString("Ephemeris segments %1 and %2 overlap.").arg(i - 1).arg(i));
                }
                else if (currStart > prevEnd)
                {
                    raiseError(QString("Gap between ephemeris segments %1 and %2.").arg(i - 1).arg(i));
                }
            }
        }
    }

    if (m_parserState == Oem_Error)
    {
        qDebug() << "Error while importing OEM file: " << errorMessage();
        delete scenario;
        scenario = NULL;
    }
    else
    {
        scenario->setName(objectName);
        sc->setName(objectName);
        sc->ElementIdentifier()->setName(objectName);
    }

    return scenario;
}
示例#7
0
bool ParseKeyNumericValue(FILE *fd, KeyNumericValueCallback callback, void *param)
{
    KeyNumericParserInfo info = { param, callback };

    return ParseKeyValue(fd, KeyNumericParserCallback, &info);
}