Exemple #1
0
static bool ConfigureDacDma(HANDLE dma_hnd, const DMA_DRIVER_MODE* dma_mode)
{
	if(dma_mode->dma_index < INALID_DRV_INDX)
	{
		if(dma_hnd->res < RES_CLOSED)
		{
			dma_hnd->hcontrol(DCR_CANCEL);
			dma_hnd->close();
		}
		return dma_hnd->drv_open(dma_mode->dma_index, dma_mode);
	}
	return true;
}
Exemple #2
0
bool StLangMap::open(const StString& theLngFilePath) {
    myLngFile = theLngFilePath;

#ifdef _WIN32
    // it is possible to use std::ifstream, but only for ANSI filenames
    HANDLE inFile = CreateFileW(myLngFile.toUtfWide().toCString(), GENERIC_READ, FILE_SHARE_READ, NULL,
                                OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
    if(inFile == INVALID_HANDLE_VALUE) {
        ST_DEBUG_LOG("StLangMap, Failed to open language file \"" + myLngFile + '\"');
        return false;
    }
#else
    std::ifstream inFile;
    inFile.open(myLngFile.toCString());
    if(inFile.fail()) {
        ST_DEBUG_LOG("StLangMap, Failed to open language file \"" + myLngFile + '\"');
        return false;
    }
#endif
    char bufferOrig[READ_BUFFER_SIZE]; bufferOrig[0] = '\0';
    char* bufferLineOrig = new char[1];
    bufferLineOrig[0] = '\0';
    size_t aLineSize = 0;

    StString bufferLineUTF;
    bool isCont = false;
    size_t oldLen = 0;

#ifdef _WIN32
    DWORD aBytesRead = 0;
    while(ReadFile(inFile, bufferOrig, READ_BUFFER_SIZE, &aBytesRead, NULL)) {
        if(aBytesRead < 1) {
            break;
        }
#else
    while(!inFile.eof()) {
        inFile.read(bufferOrig, READ_BUFFER_SIZE);
        const size_t aBytesRead = inFile.gcount();
        if(aBytesRead < 1) {
            break;
        }
#endif
        size_t lineStart = 0;
        for(size_t c = 0; c < (size_t )aBytesRead; ++c) {
            if(bufferOrig[c] == '\n') {
                if(isCont) {
                    char* aCopy = new char[oldLen + c - lineStart + 1];
                    stMemCpy(&aCopy[0], bufferLineOrig, oldLen);
                    stMemCpy(&aCopy[oldLen], &bufferOrig[lineStart], (c - lineStart));
                    aLineSize = oldLen + c - lineStart;
                    delete[] bufferLineOrig;
                    bufferLineOrig = aCopy;
                } else {
                    delete[] bufferLineOrig;
                    bufferLineOrig = new char[c - lineStart + 1];
                    stMemCpy(bufferLineOrig, &bufferOrig[lineStart], (c - lineStart));
                    aLineSize = c - lineStart;
                }
                // remove CR symbol if needed
                if(aLineSize > 0 && bufferLineOrig[aLineSize - 1] == stUtf8_t(13)) {
                    --aLineSize;
                }
                bufferLineOrig[aLineSize] = '\0';

                bufferLineUTF = StString(bufferLineOrig);
                parseLine(bufferLineUTF);

                lineStart = c + 1;
                oldLen = 0;
                isCont = false;

            } else if(c == (READ_BUFFER_SIZE - 1)) {
                char* aCopy = new char[oldLen + READ_BUFFER_SIZE - lineStart];
                if(oldLen > 0) {
                    stMemCpy(aCopy, bufferLineOrig, oldLen);
                }
                stMemCpy(&aCopy[oldLen], &bufferOrig[lineStart], (READ_BUFFER_SIZE - lineStart));
                delete[] bufferLineOrig;
                bufferLineOrig = aCopy;
                oldLen += (READ_BUFFER_SIZE - lineStart);
                isCont = true;
            }

            if(!isCont) {
                delete[] bufferLineOrig;
                bufferLineOrig = new char[1];
                bufferLineOrig[0] = '\0';
            }
        }
    }
    delete[] bufferLineOrig;
#ifdef _WIN32
    CloseHandle(inFile);
#else
    inFile.close();
#endif
    ST_DEBUG_LOG("StLangMap, Loaded language file \"" + myLngFile + '\"');
    return true;
}

StString& StLangMap::changeValue(const size_t theId) {
    return myMap[theId];
}

const StString& StLangMap::getValue(const size_t theId) const {
    const std::map<size_t, StString>::const_iterator anIter = myMap.find(theId);
    return (anIter != myMap.end()) ? anIter->second : myEmptyStr;
}

StString& StLangMap::changeValueId(const size_t theId,
                                   const char*  theDefaultValue) {
    StString& aValue = myMap[theId];
    if(aValue.isEmpty()) {
        if(myToShowId) {
            aValue = StString('[') + theId + ']' + theDefaultValue;
        } else {
            aValue = theDefaultValue;
        }
    }
    return aValue;
}