Dictionary::Dictionary(const std::wstring& locale) { std::wstring basePath = GetDllDir() + L"locales\\"; // Always load base locale first - that's our fallback ReadDictionary(basePath, baseLocale); // Now try to load by full locale code if (locale != baseLocale && !ReadDictionary(basePath, locale)) { // Fall back to short locale name size_t pos = locale.find(L'-'); if (pos != std::wstring::npos && locale.compare(0, pos, baseLocale) != 0) ReadDictionary(basePath, locale.substr(0, pos)); } }
// Open code bool ResourceArchive::Open(const String & archiveName) { lastResourceIndex = -1; lastResourceName = ""; archiveFile = fileSystem->CreateFile(archiveName.c_str(), IO::EFA_OPEN | IO::EFA_READ); if (!archiveFile)return false; if (sizeof(Header) != archiveFile->Read(&header, sizeof(Header))) { SafeRelease(archiveFile); return false; } withPaths = header.flags & EHF_WITHPATHS; if (!ReadDictionary())return false; // // for (uint32 file = 0; file < header.fileCount; ++file) // { // printf("name:%s offset:%d size:%d\n", nodeArray[file].pathName.c_str(), nodeArray[file].filePosition, nodeArray[file].fileSize); // // } return true; }
/* main - main program * * Parameters: * argc - number of command line arguments * argv - pointer to command line argument array * * Returns: * none */ void main(int argc, char **argv) { DATABASE_S_T data; /* main database */ /* open dictionary then read it in */ if ( OpenDictionary( DEFAULT_DICTIONARY, &data.dict ) ) { fprintf(stderr, "Error: opening %s as dictionary\n", DEFAULT_DICTIONARY); exit(1); } else { ReadDictionary( &data.dict ); } /* get sentence input */ if (argc EQ 1) { #ifdef DEBUG DisplayDictionary( &data.dict ); #endif if ( GetSentence( &data.current_sent ) ) { fprintf(stderr, "Error: getting sentence\n" ); exit(1); } } else { fprintf(stderr, "Error: command line input not supported yet\n" ); exit(1); } /* parse the sentence */ ParseSentence( &data.dict, &data.current_sent ); #ifdef DEBUG DisplaySentence( &data.current_sent ); #endif /* display the sentence diagram */ DiagramSentence( &data.current_sent ); exit(0); }
static int Compress(int quality, int lgwin, FILE* fin, FILE* fout, const char *dictionary_path) { BrotliEncoderState* s = BrotliEncoderCreateInstance(0, 0, 0); uint8_t* buffer = (uint8_t*)malloc(kFileBufferSize << 1); uint8_t* input = buffer; uint8_t* output = buffer + kFileBufferSize; size_t available_in = 0; const uint8_t* next_in = NULL; size_t available_out = kFileBufferSize; uint8_t* next_out = output; int is_eof = 0; int is_ok = 1; if (!s || !buffer) { is_ok = 0; goto finish; } BrotliEncoderSetParameter(s, BROTLI_PARAM_QUALITY, (uint32_t)quality); BrotliEncoderSetParameter(s, BROTLI_PARAM_LGWIN, (uint32_t)lgwin); if (dictionary_path != NULL) { size_t dictionary_size = 0; uint8_t* dictionary = ReadDictionary(dictionary_path, &dictionary_size); BrotliEncoderSetCustomDictionary(s, dictionary_size, dictionary); free(dictionary); } while (1) { if (available_in == 0 && !is_eof) { available_in = fread(input, 1, kFileBufferSize, fin); next_in = input; if (ferror(fin)) break; is_eof = feof(fin); } if (!BrotliEncoderCompressStream(s, is_eof ? BROTLI_OPERATION_FINISH : BROTLI_OPERATION_PROCESS, &available_in, &next_in, &available_out, &next_out, NULL)) { is_ok = 0; break; } if (available_out != kFileBufferSize) { size_t out_size = kFileBufferSize - available_out; fwrite(output, 1, out_size, fout); if (ferror(fout)) break; available_out = kFileBufferSize; next_out = output; } if (BrotliEncoderIsFinished(s)) break; } finish: free(buffer); BrotliEncoderDestroyInstance(s); if (!is_ok) { /* Should detect OOM? */ fprintf(stderr, "failed to compress data\n"); return 0; } else if (ferror(fout)) { fprintf(stderr, "failed to write output\n"); return 0; } else if (ferror(fin)) { fprintf(stderr, "failed to read input\n"); return 0; } return 1; }
static int Decompress(FILE* fin, FILE* fout, const char* dictionary_path) { /* Dictionary should be kept during first rounds of decompression. */ uint8_t* dictionary = NULL; uint8_t* input; uint8_t* output; size_t total_out; size_t available_in; const uint8_t* next_in; size_t available_out = kFileBufferSize; uint8_t* next_out; BrotliResult result = BROTLI_RESULT_ERROR; BrotliState* s = BrotliCreateState(NULL, NULL, NULL); if (!s) { fprintf(stderr, "out of memory\n"); return 0; } if (dictionary_path != NULL) { size_t dictionary_size = 0; dictionary = ReadDictionary(dictionary_path, &dictionary_size); BrotliSetCustomDictionary(dictionary_size, dictionary, s); } input = (uint8_t*)malloc(kFileBufferSize); output = (uint8_t*)malloc(kFileBufferSize); if (!input || !output) { fprintf(stderr, "out of memory\n"); goto end; } next_out = output; result = BROTLI_RESULT_NEEDS_MORE_INPUT; while (1) { if (result == BROTLI_RESULT_NEEDS_MORE_INPUT) { if (feof(fin)) { break; } available_in = fread(input, 1, kFileBufferSize, fin); next_in = input; if (ferror(fin)) { break; } } else if (result == BROTLI_RESULT_NEEDS_MORE_OUTPUT) { fwrite(output, 1, kFileBufferSize, fout); if (ferror(fout)) { break; } available_out = kFileBufferSize; next_out = output; } else { break; /* Error or success. */ } result = BrotliDecompressStream(&available_in, &next_in, &available_out, &next_out, &total_out, s); } if (next_out != output) { fwrite(output, 1, (size_t)(next_out - output), fout); } if ((result == BROTLI_RESULT_NEEDS_MORE_OUTPUT) || ferror(fout)) { fprintf(stderr, "failed to write output\n"); } else if (result != BROTLI_RESULT_SUCCESS) { /* Error or needs more input. */ fprintf(stderr, "corrupt input\n"); } end: free(dictionary); free(input); free(output); BrotliDestroyState(s); return (result == BROTLI_RESULT_SUCCESS) ? 1 : 0; }
tTJSVariant* tTJSBinarySerializer::ReadBasicType( const tjs_uint8* buff, const tjs_uint size, tjs_uint& index ) { if( index > size ) return NULL; tjs_uint8 type = buff[index]; index++; switch( type ) { case TYPE_NIL: return new tTJSVariant((iTJSDispatch2*)NULL); case TYPE_VOID: return new tTJSVariant(); case TYPE_TRUE: return new tTJSVariant((tjs_int)1); case TYPE_FALSE: return new tTJSVariant((tjs_int)0); case TYPE_STRING8: { if( (index+sizeof(tjs_uint8)) > size ) TJS_eTJSError( TJSReadError ); tjs_uint8 len = buff[index]; index++; if( (index+(len*sizeof(tjs_char))) > size ) TJS_eTJSError( TJSReadError ); return ReadStringVarint( buff, len, index ); } case TYPE_STRING16: { if( (index+sizeof(tjs_uint16)) > size ) TJS_eTJSError( TJSReadError ); tjs_uint16 len = Read16( buff, index ); if( (index+(len*sizeof(tjs_char))) > size ) TJS_eTJSError( TJSReadError ); return ReadStringVarint( buff, len, index ); } case TYPE_STRING32: { if( (index+sizeof(tjs_uint32)) > size ) TJS_eTJSError( TJSReadError ); tjs_uint32 len = Read32( buff, index ); if( (index+(len*sizeof(tjs_char))) > size ) TJS_eTJSError( TJSReadError ); return ReadStringVarint( buff, len, index ); } case TYPE_FLOAT: { if( (index+sizeof(float)) > size ) TJS_eTJSError( TJSReadError ); tjs_uint32 t = Read32( buff, index ); return new tTJSVariant(*(float*)&t); } case TYPE_DOUBLE: { if( (index+sizeof(double)) > size ) TJS_eTJSError( TJSReadError ); tjs_uint64 t = Read64( buff, index ); return new tTJSVariant(*(double*)&t); } case TYPE_UINT8: { if( (index+sizeof(tjs_uint8)) > size ) TJS_eTJSError( TJSReadError ); tjs_uint8 t = buff[index]; index++; return new tTJSVariant( t ); } case TYPE_UINT16: { if( (index+sizeof(tjs_uint16)) > size ) TJS_eTJSError( TJSReadError ); tjs_uint16 t = Read16( buff, index ); return new tTJSVariant( t ); } case TYPE_UINT32: { if( (index+sizeof(tjs_uint32)) > size ) TJS_eTJSError( TJSReadError ); tjs_uint32 t = Read32( buff, index ); return new tTJSVariant( (tjs_int64)t ); } case TYPE_UINT64: { if( (index+sizeof(tjs_uint64)) > size ) TJS_eTJSError( TJSReadError ); tjs_uint64 t = Read64( buff, index ); return new tTJSVariant( (tjs_int64)t ); } case TYPE_INT8: { if( (index+sizeof(tjs_uint8)) > size ) TJS_eTJSError( TJSReadError ); tjs_uint8 t = buff[index]; index++; return new tTJSVariant( (tjs_int8)t ); } case TYPE_INT16: { if( (index+sizeof(tjs_uint16)) > size ) TJS_eTJSError( TJSReadError ); tjs_uint16 t = Read16( buff, index ); return new tTJSVariant( (tjs_int16)t ); } case TYPE_INT32: { if( (index+sizeof(tjs_uint32)) > size ) TJS_eTJSError( TJSReadError ); tjs_uint32 t = Read32( buff, index ); return new tTJSVariant( (tjs_int32)t ); } case TYPE_INT64: { if( (index+sizeof(tjs_uint64)) > size ) TJS_eTJSError( TJSReadError ); tjs_uint64 t = Read64( buff, index ); return new tTJSVariant( (tjs_int64)t ); } case TYPE_RAW16: { if( (index+sizeof(tjs_uint16)) > size ) TJS_eTJSError( TJSReadError ); tjs_uint16 len = Read16( buff, index ); if( (index+len) > size ) TJS_eTJSError( TJSReadError ); return ReadOctetVarint( buff, len, index ); } case TYPE_RAW32: { if( (index+sizeof(tjs_uint32)) > size ) TJS_eTJSError( TJSReadError ); tjs_uint32 len = Read32( buff, index ); if( (index+len) > size ) TJS_eTJSError( TJSReadError ); return ReadOctetVarint( buff, len, index ); } case TYPE_ARRAY16: { if( (index+sizeof(tjs_uint16)) > size ) TJS_eTJSError( TJSReadError ); tjs_uint16 count = Read16( buff, index ); return ReadArray( buff, size, count, index ); } case TYPE_ARRAY32: { if( (index+sizeof(tjs_uint32)) > size ) TJS_eTJSError( TJSReadError ); tjs_uint32 count = Read32( buff, index ); return ReadArray( buff, size, count, index ); } case TYPE_MAP16: { if( (index+sizeof(tjs_uint16)) > size ) TJS_eTJSError( TJSReadError ); tjs_uint16 count = Read16( buff, index ); return ReadDictionary( buff, size, count, index ); } case TYPE_MAP32: { if( (index+sizeof(tjs_uint32)) > size ) TJS_eTJSError( TJSReadError ); tjs_uint32 count = Read32( buff, index ); return ReadDictionary( buff, size, count, index ); } default: { if( type >= TYPE_POSITIVE_FIX_NUM_MIN && type <= TYPE_POSITIVE_FIX_NUM_MAX ) { tjs_int value = type; return new tTJSVariant(value); } else if( type >= TYPE_NEGATIVE_FIX_NUM_MIN && type <= TYPE_NEGATIVE_FIX_NUM_MAX ) { tjs_int value = type; return new tTJSVariant(value); } else if( type >= TYPE_FIX_RAW_MIN && type <= TYPE_FIX_RAW_MAX ) { // octet tjs_int len = type - TYPE_FIX_RAW_MIN; if( (len*sizeof(tjs_uint8)+index) > size ) TJS_eTJSError( TJSReadError ); return ReadOctetVarint( buff, len, index ); } else if( type >= TYPE_FIX_STRING_MIN && type <= TYPE_FIX_STRING_MAX ) { tjs_int len = type - TYPE_FIX_STRING_MIN; if( (len*sizeof(tjs_char)+index) > size ) TJS_eTJSError( TJSReadError ); return ReadStringVarint( buff, len, index ); } else if( type >= TYPE_FIX_ARRAY_MIN && type <= TYPE_FIX_ARRAY_MAX ) { tjs_int count = type - TYPE_FIX_ARRAY_MIN; return ReadArray( buff, size, count, index ); } else if( type >= TYPE_FIX_MAP_MIN && type <= TYPE_FIX_MAP_MAX ) { tjs_int count = type - TYPE_FIX_MAP_MIN; return ReadDictionary( buff, size, count, index ); } else { TJS_eTJSError( TJSReadError ); return NULL; } } } }