⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 configfile.cpp

📁 Open VXI. This is a open source.
💻 CPP
字号:
/****************License************************************************ * * Copyright 2000-2001.  SpeechWorks International, Inc.   * * Use of this software is subject to notices and obligations set forth * in the SpeechWorks Public License - Software Version 1.1 which is * included with this software. * * SpeechWorks is a registered trademark, and SpeechWorks Here,  * DialogModules and the SpeechWorks logo are trademarks of SpeechWorks  * International, Inc. in the United States and other countries.  *  *********************************************************************** * * $Id: ConfigFile.cpp,v 1.8.4.2 2001/10/03 16:33:54 dmeyer Exp $ * * SB Configuration File Parser - implementation * ********************************************************************** */static const char *rcsid = 0 ? (char *) &rcsid :"$Id: ConfigFile.cpp,v 1.8.4.2 2001/10/03 16:33:54 dmeyer Exp $";// -----1=0-------2=0-------3=0-------4=0-------5=0-------6=0-------7=0-------8#include <iostream>using namespace std;#include "ConfigFile.h"          // Header for these functions#define READ_BUFFER_SIZE 2048extern "C"VXIplatformResult ParseConfigLine(char* buffer, VXIMap *configArgs){    char *end;    const char *configKey, *configType, *configValue;    /* Skip blank lines or those starting with comments */    if((buffer[0] == '\0') || (buffer[0] == CONFIG_FILE_COMMENT_ID) ||       (strspn(buffer, CONFIG_FILE_SEPARATORS) == strlen(buffer))) {        return VXIplatform_RESULT_SUCCESS;    }    /* Get the configuration key */    configKey = buffer;    if(strchr(CONFIG_FILE_SEPARATORS, configKey[0]) != NULL) {       return VXIplatform_RESULT_FAILURE;    }    end = strpbrk(configKey, CONFIG_FILE_SEPARATORS);    if(end == NULL) {        return VXIplatform_RESULT_FAILURE;    }    *end = '\0'; /* terminate configKey */    /* Get the configuration type */    configType = end + 1;    configType = &configType[strspn(configType, CONFIG_FILE_SEPARATORS)];    if(configType[0] == '\0') {        return VXIplatform_RESULT_FAILURE;    }    end = strpbrk(configType, CONFIG_FILE_SEPARATORS);    if(end == NULL) {        return VXIplatform_RESULT_FAILURE;    }    *end = '\0'; /* terminate configType */    /* Get the configuration value, stripping trailing whitespace */    configValue = end + 1;    configValue = &configValue[strspn(configValue, CONFIG_FILE_SEPARATORS)];    if(configValue[0] == '\0') {        return VXIplatform_RESULT_FAILURE;    }    end = strchr(configValue, '\0');    while((end > configValue) &&	  (strchr(CONFIG_FILE_SEPARATORS, *(end - 1)) != NULL))      end--;    if(end == configValue) {        return VXIplatform_RESULT_FAILURE;    }    *end = '\0'; /* terminate configValue */    string expStr("");    if(configValue != NULL) {        // Resolve environment variables, if any        const char *envVarBgn, *envVarEnd;        const VXIint lenBgn = strlen(CONFIG_FILE_ENV_VAR_BEGIN_ID);        const VXIint lenEnd = strlen(CONFIG_FILE_ENV_VAR_END_ID);        const char *ptrValue = configValue;        while((envVarBgn = strstr(ptrValue, CONFIG_FILE_ENV_VAR_BEGIN_ID)) !=	      NULL) {	    if (envVarBgn != ptrValue)	      expStr.assign (ptrValue, envVarBgn - ptrValue);	    envVarBgn += lenBgn;	    if(envVarBgn[0] == 0)                return VXIplatform_RESULT_FAILURE;            envVarEnd = strstr(envVarBgn, CONFIG_FILE_ENV_VAR_END_ID);            if((envVarEnd == NULL) || (envVarEnd == envVarBgn))                return VXIplatform_RESULT_FAILURE;            string envStr(envVarBgn, envVarEnd - envVarBgn);            const char *envVarValue = getenv(envStr.c_str());            if((envVarValue == NULL) || (envVarValue[0] == 0)) {	        fprintf (stderr,"ERROR: Environment variable not set, %s\n",			 envStr.c_str( ));                return VXIplatform_RESULT_FAILURE;	    }            expStr += envVarValue;            ptrValue = envVarEnd + lenEnd;        }        expStr += ptrValue;        configValue = expStr.c_str();    }    VXIint keyLen = strlen(configKey) + 1;    VXIchar *wConfigKey = new VXIchar [keyLen];    if(wConfigKey == NULL) {        return VXIplatform_RESULT_OUT_OF_MEMORY;    }    mbstowcs(wConfigKey, configKey, keyLen);    if(strcmp(configType, "Environment") == 0) { // Set environment variable        int cfgValLen = configValue ? strlen(configValue) : 0;        char *envVar = new char [strlen(configKey) + cfgValLen + 2];        if(envVar == NULL) {            delete [] wConfigKey;            return VXIplatform_RESULT_OUT_OF_MEMORY;        }#ifdef WIN32        sprintf(envVar, "%s=%s", configKey, configValue ? configValue : "");        _putenv(envVar);#else        if(configValue)            sprintf(envVar, "%s=%s", configKey, configValue);        else            strcpy(envVar, configKey); // Remove variable from environment        putenv(envVar);#endif        // 'envVar' must NOT be freed !!!    }    else if(strcmp(configType, "VXIPtr") == 0) {        // Only NULL pointers are supported        VXIMapSetProperty(configArgs, wConfigKey,                          (VXIValue *)VXIPtrCreate(NULL));    }    else {        if(configValue == NULL) {            delete [] wConfigKey;            return VXIplatform_RESULT_FAILURE;        }        if(strcmp(configType, "VXIInteger") == 0) {            VXIint32 intValue = (VXIint32)atoi(configValue);            if((intValue == 0) && (configValue[0] != '0')) {                delete [] wConfigKey;                return VXIplatform_RESULT_FAILURE;            }            VXIMapSetProperty(configArgs, wConfigKey,                               (VXIValue *)VXIIntegerCreate(intValue));    }        else if(strcmp(configType, "VXIFloat") == 0) {            VXIflt32 fltValue = (VXIflt32)atof(configValue);             if((fltValue == 0.0) &&                 ((configValue[0] != '0') || (configValue[0] != '.'))) {                delete [] wConfigKey;                return VXIplatform_RESULT_FAILURE;            }            VXIMapSetProperty(configArgs, wConfigKey,                               (VXIValue *)VXIFloatCreate(fltValue));        }        else if(strcmp(configType, "VXIString") == 0) {            VXIint valLen = strlen(configValue) + 1;            VXIchar *wConfigValue = new VXIchar [valLen];            if(wConfigValue == NULL) {                delete [] wConfigKey;                return VXIplatform_RESULT_OUT_OF_MEMORY;            }            mbstowcs(wConfigValue, configValue, valLen);            VXIMapSetProperty(configArgs, wConfigKey,                               (VXIValue *)VXIStringCreate(wConfigValue));            delete [] wConfigValue;        }        else {            delete [] wConfigKey;            return VXIplatform_RESULT_UNSUPPORTED;        }    }    delete [] wConfigKey;    return VXIplatform_RESULT_SUCCESS;}extern "C"VXIplatformResult ParseConfigFile (VXIMap **configArgs, const char *fileName){    VXIplatformResult platformResult = VXIplatform_RESULT_SUCCESS;    char buffer[READ_BUFFER_SIZE];    VXIint lineNum = 0;    char *readResult;    if((configArgs == NULL) || (fileName == NULL)) {        return VXIplatform_RESULT_INVALID_ARGUMENT;    }    *configArgs = VXIMapCreate();    if(*configArgs == NULL) {        cerr << "ERROR: Not enough memory to create config map" << endl;        return VXIplatform_RESULT_OUT_OF_MEMORY;    }    FILE *configFile = fopen(fileName, "r");    if(configFile == NULL) {        cerr << "ERROR: Cannot open file '" << fileName << "'" << endl;        return VXIplatform_RESULT_SYSTEM_ERROR;    }    readResult = fgets(buffer, READ_BUFFER_SIZE, configFile);    while(readResult != NULL) {        lineNum++;        platformResult = ParseConfigLine(buffer, *configArgs);        if(platformResult == VXIplatform_RESULT_FAILURE) {            cerr << "WARNING: Syntax error on line " << lineNum                 << " in file '" << fileName << "'" << endl;            platformResult = VXIplatform_RESULT_SUCCESS;        }        else if(platformResult == VXIplatform_RESULT_UNSUPPORTED) {            cerr << "WARNING: Unsupported data on line " << lineNum                 << " in file '" << fileName << "'" << endl;            platformResult = VXIplatform_RESULT_SUCCESS;        }        else if(platformResult != VXIplatform_RESULT_SUCCESS) {            break;        }        readResult = fgets(buffer, READ_BUFFER_SIZE, configFile);    }    if((readResult == NULL) && !feof(configFile)) {        cerr << "ERROR: Failed reading file '" << fileName << "'" << endl;        platformResult = VXIplatform_RESULT_SYSTEM_ERROR;    }    fclose(configFile);    return platformResult;}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -