diff --git a/corec/corec/CMakeLists.txt b/corec/corec/CMakeLists.txt index 76fa40f6..1227a648 100644 --- a/corec/corec/CMakeLists.txt +++ b/corec/corec/CMakeLists.txt @@ -43,7 +43,6 @@ set(corec_node_PUBLIC_HEADERS ${CMAKE_CURRENT_SOURCE_DIR}/node/node.h ${CMAKE_CURRENT_SOURCE_DIR}/node/nodebase.h ${CMAKE_CURRENT_SOURCE_DIR}/node/nodetree.h - ${CMAKE_CURRENT_SOURCE_DIR}/node/nodetools.h ) add_library("corec_node" ${corec_node_SOURCES} ${corec_node_PUBLIC_HEADERS} ${corec_base_PUBLIC_HEADERS}) target_include_directories("corec_node" PUBLIC ".") diff --git a/corec/corec/array/array.c b/corec/corec/array/array.c index 5fea604c..175feca4 100644 --- a/corec/corec/array/array.c +++ b/corec/corec/array/array.c @@ -28,6 +28,7 @@ ****************************************************************************/ #include "array.h" +#include typedef struct datahead { diff --git a/corec/corec/array/array.h b/corec/corec/array/array.h index 7b1b4030..0fc22b0c 100644 --- a/corec/corec/array/array.h +++ b/corec/corec/array/array.h @@ -30,8 +30,7 @@ #ifndef __ARRAY_H #define __ARRAY_H -#include "corec/corec.h" -#include "corec/memheap.h" +#include #ifdef __cplusplus extern "C" { @@ -47,6 +46,8 @@ extern "C" { #define Data_Var(type,name,len) struct { size_t n; type p[len]; } __##name; type* name = (__##name.n = sizeof(__##name.p),__##name.p) +typedef struct cc_memheap cc_memheap; + typedef struct array { // these are private members, use ARRAY macros to access them diff --git a/corec/corec/helpers/CMakeLists.txt b/corec/corec/helpers/CMakeLists.txt index c4114d16..7b345214 100644 --- a/corec/corec/helpers/CMakeLists.txt +++ b/corec/corec/helpers/CMakeLists.txt @@ -48,24 +48,13 @@ target_include_directories("corec_file" PUBLIC $ #ifdef __cplusplus extern "C" { diff --git a/corec/corec/helpers/charconvert/charconvert_linux.c b/corec/corec/helpers/charconvert/charconvert_linux.c index 44edeb6e..1c59f6b1 100644 --- a/corec/corec/helpers/charconvert/charconvert_linux.c +++ b/corec/corec/helpers/charconvert/charconvert_linux.c @@ -28,7 +28,7 @@ ****************************************************************************/ #include "charconvert.h" -#include "corec/str/str.h" +#include #if defined(TARGET_LINUX) diff --git a/corec/corec/helpers/charconvert/charconvert_osx.c b/corec/corec/helpers/charconvert/charconvert_osx.c index da8e88c5..f6940880 100644 --- a/corec/corec/helpers/charconvert/charconvert_osx.c +++ b/corec/corec/helpers/charconvert/charconvert_osx.c @@ -28,7 +28,7 @@ ****************************************************************************/ #include "charconvert.h" -#include "corec/str/str.h" +#include #if defined(TARGET_OSX) diff --git a/corec/corec/helpers/charconvert/charconvert_utf8.c b/corec/corec/helpers/charconvert/charconvert_utf8.c index 832c9591..f23f8814 100644 --- a/corec/corec/helpers/charconvert/charconvert_utf8.c +++ b/corec/corec/helpers/charconvert/charconvert_utf8.c @@ -28,7 +28,7 @@ ****************************************************************************/ #include "charconvert.h" -#include "corec/str/str.h" +#include static const uint16_t codepage_1250[128] = { 0x20ac,0x0081,0x201a,0x0083,0x201e,0x2026,0x2020,0x2021,0x0088,0x2030,0x0160,0x2039,0x015a,0x0164,0x017d,0x0179, diff --git a/corec/corec/helpers/charconvert/charconvert_win32.c b/corec/corec/helpers/charconvert/charconvert_win32.c index 98141a22..72b7df5e 100644 --- a/corec/corec/helpers/charconvert/charconvert_win32.c +++ b/corec/corec/helpers/charconvert/charconvert_win32.c @@ -28,7 +28,7 @@ ****************************************************************************/ #include "charconvert.h" -#include "corec/str/str.h" +#include #if defined(TARGET_WIN) diff --git a/corec/corec/helpers/date/date.h b/corec/corec/helpers/date/date.h index 53aaaaa6..cf591d10 100644 --- a/corec/corec/helpers/date/date.h +++ b/corec/corec/helpers/date/date.h @@ -30,7 +30,7 @@ #ifndef __DATE_H #define __DATE_H -#include "corec/corec.h" +#include #ifdef __cplusplus extern "C" { @@ -65,7 +65,6 @@ typedef struct datepack_t DATE_DLL datetime_t GetTimeDate(void); // UTC in s (reference is 1st January 2001 00:00:00.000 UTC, use a helper to get the localized string value) DATE_DLL datetime_t TimePackToRel(const datepack_t *tp, bool_t FromLocal); DATE_DLL bool_t GetDatePacked(datetime_t t, datepack_t *tp, bool_t ToLocal); -DATE_DLL bool_t GetIsDst(datetime_t t); // may not be correct on all platforms #ifdef __cplusplus } diff --git a/corec/corec/helpers/date/date_libc.c b/corec/corec/helpers/date/date_libc.c index 0a61f9d5..6ffe8f0c 100644 --- a/corec/corec/helpers/date/date_libc.c +++ b/corec/corec/helpers/date/date_libc.c @@ -125,17 +125,3 @@ bool_t GetDatePacked(datetime_t t, datepack_t *tp, bool_t Local) return 0; } - -bool_t GetIsDst(datetime_t t) -{ - time_t ot; - struct tm *date; - - if (t == INVALID_DATETIME_T) - return 0; - - ot = t + DATETIME_OFFSET; - date = localtime(&ot); - - return date->tm_isdst; -} diff --git a/corec/corec/helpers/date/date_win32.c b/corec/corec/helpers/date/date_win32.c index e60cd465..d4e5fd6d 100644 --- a/corec/corec/helpers/date/date_win32.c +++ b/corec/corec/helpers/date/date_win32.c @@ -50,6 +50,8 @@ static FILETIME fTimeCache[MAX_CACHED_YEAR - MIN_CACHED_YEAR + 2][2]; #define TIME_ZONE_ID_INVALID ((DWORD)0xFFFFFFFF) #endif +static bool_t GetIsDst(datetime_t t); // may not be correct on all platforms + systick_t GetTimeTick(void) { return GetTickCount(); diff --git a/corec/corec/helpers/file/bufstream.c b/corec/corec/helpers/file/bufstream.c index 18d136bd..8f2106ce 100644 --- a/corec/corec/helpers/file/bufstream.c +++ b/corec/corec/helpers/file/bufstream.c @@ -28,6 +28,7 @@ ****************************************************************************/ #include "file.h" +#include "streams.h" #define BUFSTREAM_SIZE 4096 diff --git a/corec/corec/helpers/file/file.h b/corec/corec/helpers/file/file.h index dea83657..2d113a22 100644 --- a/corec/corec/helpers/file/file.h +++ b/corec/corec/helpers/file/file.h @@ -30,8 +30,7 @@ #ifndef __FILE_H #define __FILE_H -#include "corec/node/node.h" -#include "corec/helpers/date/date.h" +#include #ifdef __cplusplus extern "C" { @@ -50,22 +49,14 @@ extern "C" { FILE_DLL void CoreC_FileInit(nodemodule* Module); -FILE_DLL bool_t FileExists(nodecontext*, const tchar_t*); -FILE_DLL bool_t FileMove(nodecontext*, const tchar_t* In,const tchar_t* Out); -FILE_DLL datetime_t FileDateTime(nodecontext*, const tchar_t*); FILE_DLL bool_t PathIsFolder(nodecontext*, const tchar_t*); -FILE_DLL bool_t FolderCreate(nodecontext*, const tchar_t*); // \param Force erase even if the file is read-only // \param Safe put in the OS trash rather than a permanent erase FILE_DLL bool_t FileErase(nodecontext*, const tchar_t*, bool_t Force, bool_t Safe); -FILE_DLL bool_t FolderErase(nodecontext*, const tchar_t*, bool_t Force, bool_t Safe); -FILE_DLL void FindFiles(nodecontext*,const tchar_t* Path, const tchar_t* Mask,void(*Process)(const tchar_t*,void*),void* Param); -FILE_DLL int64_t GetPathFreeSpace(nodecontext*,const tchar_t* Path); FILE_DLL void RemovePathDelimiter(tchar_t* Path); FILE_DLL void AddPathDelimiter(tchar_t* Path,size_t PathLen); FILE_DLL const tchar_t* GetProtocol(const tchar_t* URL, tchar_t *_Protocol, int ProtoLen, bool_t* HasHost); -FILE_DLL fourcc_t GetProtocolKind(anynode*, tchar_t *_Protocol); FILE_DLL void SplitPath(const tchar_t* Path, tchar_t* Dir, int DirLen, tchar_t* Name, int NameLen, tchar_t* Ext, int ExtLen); FILE_DLL void SplitURL(const tchar_t* URL, tchar_t* Mime, int MimeLen, tchar_t* Host, int HostLen, int* Port, tchar_t* Path, int PathLen); FILE_DLL bool_t SplitAddr(const tchar_t* URL, tchar_t* Peer, int PeerLen, tchar_t* Local, int LocalLen); @@ -76,31 +67,6 @@ FILE_DLL void AbsPathNormalize(tchar_t* Abs, size_t AbsLen); FILE_DLL void ReduceLocalPath(tchar_t* Abs, size_t AbsLen); FILE_DLL void RelPath(tchar_t* Rel, int RelLen, const tchar_t* Path, const tchar_t* Base); FILE_DLL bool_t UpperPath(tchar_t* Path, tchar_t* Last, size_t LastLen); -FILE_DLL void StreamLoginInfo(node* p, tchar_t* URL, bool_t Proxy); //URL updated - -FILE_DLL tchar_t* FirstSepar(const tchar_t *Path); -FILE_DLL void SplitURLLogin(const tchar_t *URL, tchar_t *UserName, size_t UserNameLen, tchar_t *Password, size_t PasswordLen, tchar_t *URL2, size_t URL2Len); -FILE_DLL void SplitShare(const tchar_t *Path, tchar_t *Share, size_t ShareLen, tchar_t *Path2, size_t Path2Len); -FILE_DLL tchar_t *MergeURL(tchar_t *URL, size_t URLLen, const tchar_t *Proto, const tchar_t *Host, int Port, const tchar_t *Path); -FILE_DLL tchar_t *GetIP(tchar_t *sIP, size_t IPLen, long IP); -FILE_DLL void SplitURLParams(const tchar_t* URL, tchar_t* URL2, int URL2Len, tchar_t* Params, int ParamsLen); -FILE_DLL tchar_t *AddCacheURL(tchar_t* Out, size_t Len, const tchar_t *In); -FILE_DLL bool_t CheckRemoveCacheURL(const tchar_t** URL); -FILE_DLL bool_t RemoveURLParam(tchar_t* URL, const tchar_t* Param); - -static INLINE size_t FileBlockSize(filepos_t Start,filepos_t End) -{ - End -= Start; - if (End<0 || End>INT_MAX) - return 0; - return (size_t)End; -} - -#include "corec/helpers/file/streams.h" - -FILE_DLL stream *FileTemp(anynode*); -FILE_DLL bool_t FileTempName(anynode*,tchar_t *Out, size_t OutLen); -FILE_DLL err_t FileStat(nodecontext* p, const tchar_t* Path, streamdir* Item); #ifdef __cplusplus } diff --git a/corec/corec/helpers/file/file_libc.c b/corec/corec/helpers/file/file_libc.c index 5d40d92b..0b4d4181 100644 --- a/corec/corec/helpers/file/file_libc.c +++ b/corec/corec/helpers/file/file_libc.c @@ -28,6 +28,8 @@ ****************************************************************************/ #include "file.h" +#include "streams.h" +#include #ifdef CONFIG_FILEPOS_64 #define __USE_FILE_OFFSET64 @@ -279,12 +281,6 @@ META_DATA(TYPE_FILEPOS,STREAM_LENGTH,filestream,Length) META_PARAM(STRING,NODE_PROTOCOL,T("file")) META_END(STREAM_CLASS) -bool_t FileExists(nodecontext *p,const tchar_t* Path) -{ - struct stat file_stats; - return stat(Path, &file_stats) == 0; -} - bool_t FileErase(nodecontext *p,const tchar_t* Path, bool_t Force, bool_t Safe) { if (Force) @@ -302,23 +298,6 @@ bool_t FileErase(nodecontext *p,const tchar_t* Path, bool_t Force, bool_t Safe) return unlink(Path) == 0; } -bool_t FolderErase(nodecontext *p,const tchar_t* Path, bool_t Force, bool_t Safe) -{ - if (Force) - { - struct stat file_stats; - if (stat(Path, &file_stats) == 0) - { - if ((file_stats.st_mode & S_IWUSR)==0) - { - file_stats.st_mode |= S_IWUSR; - chmod(Path,file_stats.st_mode); - } - } - } - return rmdir(Path) == 0; -} - bool_t PathIsFolder(nodecontext *p,const tchar_t* Path) { struct stat file_stats; @@ -328,80 +307,3 @@ bool_t PathIsFolder(nodecontext *p,const tchar_t* Path) } return 0; } - -datetime_t FileDateTime(nodecontext *p,const tchar_t* Path) -{ - datetime_t Date = INVALID_DATETIME_T; - struct stat file_stats; - if (stat(Path, &file_stats) == 0) - Date = LinuxToDateTime(file_stats.st_mtime); - return Date; -} - -bool_t FileMove(nodecontext *p,const tchar_t* In,const tchar_t* Out) -{ - return rename(In,Out) == 0; -} - -bool_t FolderCreate(nodecontext *p,const tchar_t* Path) -{ - return mkdir(Path,_RW_ACCESS_DIR) == 0; -} - -void FindFiles(nodecontext *p,const tchar_t* Path, const tchar_t* Mask,void(*Process)(const tchar_t*,void*),void* Param) -{ - DIR* Directory; - struct dirent* DirectoryInfo; - tchar_t TPathToFile[MAXPATH]; - - Directory = opendir(Path); - if (Directory) - { - while ( (DirectoryInfo = readdir(Directory)) != NULL ) - { - char* FileExtension = 0; - FileExtension = strrchr(DirectoryInfo->d_name, '.'); - if(FileExtension) - { - if (strcmp(Mask, FileExtension ) == 0 ) - { - tcscpy_s(TPathToFile, TSIZEOF(TPathToFile), Path); - tcscat_s(TPathToFile, TSIZEOF(TPathToFile), DirectoryInfo->d_name); - Process(TPathToFile, Param); - } - } - } - - closedir(Directory); - } - -} - -stream *FileTemp(anynode *Any) -{ -#ifndef TODO - assert(NULL); // not supported yet -#endif - return NULL; -} - -bool_t FileTempName(anynode *Any,tchar_t *Out, size_t OutLen) -{ -#ifndef TODO - assert(NULL); // not supported yet -#endif - return 0; -} - -int64_t GetPathFreeSpace(nodecontext* UNUSED_PARAM(p), const tchar_t* Path) -{ -#ifndef TODO - // need to an include (see at includes) - struct statfs st; - if (statfs(Path, &st) < 0) - return -1; - return (int64_t)st.f_bsize * (int64_t)st.f_bavail; -#else - return -1; -#endif -} diff --git a/corec/corec/helpers/file/file_win32.c b/corec/corec/helpers/file/file_win32.c index 02e7d76f..8d06ce34 100644 --- a/corec/corec/helpers/file/file_win32.c +++ b/corec/corec/helpers/file/file_win32.c @@ -28,6 +28,8 @@ ****************************************************************************/ #include "file.h" +#include "streams.h" +#include #if defined(TARGET_WIN) @@ -402,16 +404,6 @@ META_PARAM(STRING,NODE_PROTOCOL,T("file")) META_END(STREAM_CLASS) -bool_t FolderCreate(nodecontext* UNUSED_PARAM(p),const tchar_t* Path) -{ - return CreateDirectory(Path,NULL) != FALSE; -} - -bool_t FileExists(nodecontext* UNUSED_PARAM(p),const tchar_t* Path) -{ - return GetFileAttributes(Path) != (DWORD)-1; -} - static bool_t FileRecycle(const tchar_t* Path) { tchar_t PathEnded[MAXPATHFULL]; @@ -448,97 +440,9 @@ bool_t FileErase(nodecontext* UNUSED_PARAM(p),const tchar_t* Path, bool_t Force, return FileRecycle(Path); } -bool_t FolderErase(nodecontext* UNUSED_PARAM(p),const tchar_t* Path, bool_t Force, bool_t Safe) -{ - if (Force) - { - DWORD attr = GetFileAttributes(Path); - if ((attr != (DWORD)-1) && (attr & FILE_ATTRIBUTE_READONLY)) - { - attr ^= FILE_ATTRIBUTE_READONLY; - SetFileAttributes(Path,attr); - } - } - - if (!Safe) - return RemoveDirectory(Path) != FALSE; - else - return FileRecycle(Path); -} - bool_t PathIsFolder(nodecontext* UNUSED_PARAM(p),const tchar_t* Path) { DWORD attr = GetFileAttributes(Path); return (attr != (DWORD)-1) && (attr & FILE_ATTRIBUTE_DIRECTORY) == FILE_ATTRIBUTE_DIRECTORY; } - -datetime_t FileDateTime(nodecontext* UNUSED_PARAM(p),const tchar_t* Path) -{ - datetime_t Date = INVALID_DATETIME_T; - HANDLE Find; - WIN32_FIND_DATA FindData; - - Find = FindFirstFile(Path, &FindData); - if (Find != INVALID_HANDLE_VALUE) - { - Date = FileTimeToRel(&FindData.ftLastWriteTime); - FindClose(Find); - } - return Date; -} - -bool_t FileMove(nodecontext* UNUSED_PARAM(p),const tchar_t* In,const tchar_t* Out) -{ - return MoveFile(In,Out) != 0; -} - -void FindFiles(nodecontext* UNUSED_PARAM(p),const tchar_t* Path, const tchar_t* Mask, void(*Process)(const tchar_t*,void*),void* Param) -{ - WIN32_FIND_DATA FindData; - tchar_t FindPath[MAXPATH]; - HANDLE Find; - - tcscpy_s(FindPath,TSIZEOF(FindPath),Path); - tcscat_s(FindPath,TSIZEOF(FindPath),Mask); - Find = FindFirstFile(FindPath,&FindData); - - if (Find != INVALID_HANDLE_VALUE) - { - do - { - tcscpy_s(FindPath,TSIZEOF(FindPath),Path); - tcscat_s(FindPath,TSIZEOF(FindPath),FindData.cFileName); - Process(FindPath,Param); - } - while (FindNextFile(Find,&FindData)); - - FindClose(Find); - } -} - -stream *FileTemp(anynode* UNUSED_PARAM(Any)) -{ -#ifndef TODO - assert(NULL); // not supported yet -#endif - return NULL; -} - -bool_t FileTempName(anynode* UNUSED_PARAM(Any),tchar_t* UNUSED_PARAM(Out), size_t UNUSED_PARAM(OutLen)) -{ -#ifndef TODO - assert(NULL); // not supported yet -#endif - return 0; -} - -FILE_DLL int64_t GetPathFreeSpace(nodecontext* UNUSED_PARAM(p), const tchar_t* Path) -{ - ULARGE_INTEGER lpFreeBytesAvailable; - ULARGE_INTEGER lpTotal; - - if (!GetDiskFreeSpaceEx(Path, &lpFreeBytesAvailable, &lpTotal, NULL)) - return -1; - return (int64_t)lpFreeBytesAvailable.QuadPart; -} #endif diff --git a/corec/corec/helpers/file/memstream.c b/corec/corec/helpers/file/memstream.c index fe2aefdc..6de2ad61 100644 --- a/corec/corec/helpers/file/memstream.c +++ b/corec/corec/helpers/file/memstream.c @@ -28,6 +28,18 @@ ****************************************************************************/ #include "file.h" +#include "streams.h" + +typedef struct memstream +{ + stream Base; + filepos_t VirtualOffset; + const uint8_t* Ptr; + size_t Pos; + size_t Size; + +} memstream; + static err_t MemRead(memstream* p,void* Data,size_t Size,size_t* Readed) { diff --git a/corec/corec/helpers/file/stream_stdio.c b/corec/corec/helpers/file/stream_stdio.c index 9fad4150..0be14a26 100644 --- a/corec/corec/helpers/file/stream_stdio.c +++ b/corec/corec/helpers/file/stream_stdio.c @@ -28,6 +28,7 @@ ****************************************************************************/ #include "file.h" +#include "streams.h" #include #if defined(TARGET_WIN) diff --git a/corec/corec/helpers/file/streams.c b/corec/corec/helpers/file/streams.c index 82539587..e6c33ac1 100644 --- a/corec/corec/helpers/file/streams.c +++ b/corec/corec/helpers/file/streams.c @@ -28,12 +28,8 @@ ****************************************************************************/ #include "file.h" - -//TODO: include from somewhere else or not depend on them at all -#ifdef CONFIG_BLOCK_RDONLY -#include "common.h" -#endif -//end TODO +#include "streams.h" +#include static err_t DummySkip(void* p, intptr_t* Skip) { @@ -179,34 +175,13 @@ META_START_CONTINUE(STREAM_CLASS) META_CLASS(VMT_SIZE,sizeof(stream_vmt)) META_CLASS(SIZE,sizeof(stream)) META_CLASS(FLAGS,CFLAG_ABSTRACT) -META_PARAM(TYPE,STREAM_KIND,TYPE_FOURCC|TFLAG_RDONLY) -META_PARAM(CUSTOM,STREAM_KIND,STREAM_KIND_LOCAL) META_PARAM(NAME,STREAM_URL,T("URL")) META_PARAM(TYPE,STREAM_URL,TYPE_STRING) META_PARAM(NAME,STREAM_LENGTH,T("Length")) META_PARAM(TYPE,STREAM_LENGTH,TYPE_FILEPOS) META_PARAM(NAME,STREAM_FLAGS,T("Flags")) META_PARAM(TYPE,STREAM_FLAGS,TYPE_INT) -META_PARAM(NAME,STREAM_CONTENTTYPE,T("ContentType")) -META_PARAM(TYPE,STREAM_CONTENTTYPE,TYPE_STRING|TFLAG_RDONLY) -META_PARAM(NAME,STREAM_PRAGMA_SEND,T("PragmaSet")) -META_PARAM(TYPE,STREAM_PRAGMA_SEND,TYPE_STRING|TFLAG_RDONLY) -META_PARAM(NAME,STREAM_PRAGMA_GET,T("PragmaGet")) -META_PARAM(TYPE,STREAM_PRAGMA_GET,TYPE_STRING|TFLAG_RDONLY) -META_PARAM(NAME,STREAM_META,T("Meta")) -META_PARAM(TYPE,STREAM_META,TYPE_META) -META_PARAM(NAME,STREAM_SCOUTING,T("Scouting")) -META_PARAM(TYPE,STREAM_SCOUTING,TYPE_BOOLEAN) -META_PARAM(NAME,STREAM_TIMEOUT,T("TimeOut")) -META_PARAM(TYPE,STREAM_TIMEOUT,TYPE_INT) // TODO: TYPE_SYSTICK -META_PARAM(TYPE,STREAM_DATE,TYPE_DATETIME) -META_PARAM(NAME,STREAM_FULL_URL,T("FullURL")) -META_PARAM(TYPE,STREAM_FULL_URL,TYPE_STRING) -META_PARAM(TYPE,STREAM_PLAYING,TYPE_BOOLEAN) META_PARAM(TYPE,STREAM_ENUM_BASE,TYPE_STRING) -META_PARAM(TYPE,STREAM_TIME,TYPE_TICK) -META_PARAM(TYPE,STREAM_NATIVE_HANDLER,TYPE_PTR|TFLAG_RDONLY) -META_PARAM(TYPE,STREAM_CACHING,TYPE_BOOLEAN) META_PARAM(TYPE,STREAM_USERNAME,TYPE_STRING) META_DYNAMIC(TYPE_STRING,STREAM_USERNAME) META_PARAM(TYPE,STREAM_PASSWORD,TYPE_STRING) @@ -241,6 +216,8 @@ META_VMT(TYPE_FUNC,stream_vmt,Blocking,ProcessBlocking) META_VMT(TYPE_FUNC,stream_vmt,Wait,ProcessWait) META_END(STREAM_CLASS) +static stream* GetStream(anynode*, const tchar_t* URL, int Flags); + stream* StreamOpen(anynode *AnyNode, const tchar_t* Path, int Flags) { stream* File = GetStream(AnyNode,Path,Flags); @@ -270,75 +247,6 @@ void StreamClose(stream* File) NodeDelete((node*)File); } -bool_t StreamGenExts(anynode* AnyNode,array* Exts, fourcc_t ClassFilter, const tchar_t* TypeFilter) -{ - fourcc_t* i; - array List; - ArrayInit(Exts); - - if (TypeFilter && !TypeFilter[0]) - TypeFilter = NULL; - - NodeEnumClass(AnyNode,&List,ClassFilter); - for (i=ARRAYBEGIN(List,fourcc_t);i!=ARRAYEND(List,fourcc_t);++i) - { - const tchar_t* s = NodeStr2(AnyNode,*i,NODE_EXTS); - while (s && s[0]) - { - size_t n; - for (n=0;s[n] && s[n]!=';' && s[n]!=':';++n) {} - - if (!TypeFilter || (s[n]==':' && tcschr(TypeFilter,s[n+1])!=NULL)) - { - while (s[n] && s[n]!=';') - ++n; - - if (n) - { - if (!ARRAYEMPTY(*Exts)) - ArrayAppend(Exts,T(";"),sizeof(tchar_t),64); - ArrayAppend(Exts,s,n*sizeof(tchar_t),64); - } - } - - s = tcschr(s,';'); - if (s) ++s; - } - } - ArrayClear(&List); - - if (!ARRAYEMPTY(*Exts) && !ArrayAppend(Exts,T("\0"),sizeof(tchar_t),64)) - ArrayClear(Exts); - - return !ARRAYEMPTY(*Exts); -} - -char StreamExtType(anynode* AnyNode, fourcc_t ClassFilter, const tchar_t *Ext) -{ - char Result = FTYPE_UNDEFINED; - tchar_t *s; - size_t i; - array List; - StreamGenExts(AnyNode,&List,ClassFilter,NULL); - - for (s=ARRAYBEGIN(List,tchar_t);s;) - { - for (i=0;s[i] && s[i]==Ext[i];i++) {} - - if (!Ext[i] && s[i] == ':') - { - Result = (char)s[i+1]; - break; - } - - s = tcschr(s,';'); - if (s) ++s; - } - - ArrayClear(&List); - return Result; -} - stream* GetStream(anynode *AnyNode, const tchar_t* URL, int Flags) { tchar_t Protocol[MAXPROTOCOL]; @@ -371,12 +279,3 @@ stream* GetStream(anynode *AnyNode, const tchar_t* URL, int Flags) #endif return Stream; } - -int StreamProtocolPriority(anynode *AnyNode, const tchar_t* URL) -{ - tchar_t Protocol[MAXPROTOCOL]; - GetProtocol(URL,Protocol,TSIZEOF(Protocol),NULL); - if (tcsicmp(Protocol,T("file"))==0) // override for local files - return PRI_MAXIMUM; - return NodeClass_Priority(NodeContext_FindClass(AnyNode,NodeEnumClassStr(AnyNode,NULL,STREAM_CLASS,NODE_PROTOCOL,Protocol))); -} diff --git a/corec/corec/helpers/file/streams.h b/corec/corec/helpers/file/streams.h index de675604..88102fff 100644 --- a/corec/corec/helpers/file/streams.h +++ b/corec/corec/helpers/file/streams.h @@ -1,5 +1,5 @@ /***************************************************************************** - * + * * Copyright (c) 2008-2010, CoreCodec, Inc. * All rights reserved. * @@ -30,7 +30,7 @@ #ifndef __STREAM_H #define __STREAM_H -#include "corec/node/node.h" +#include "file.h" // FILE_DLL #define FTYPE_DIR 'D' #define FTYPE_UNDEFINED 'u' @@ -42,31 +42,13 @@ #define STREAM_URL 0x91 // tchar_t* #define STREAM_LENGTH 0x92 // filepos_t #define STREAM_FLAGS 0x93 // int -#define STREAM_CONTENTTYPE 0x95 // tchar_t* -#define STREAM_META 0x96 // metanotify -#define STREAM_PRAGMA_SEND 0x97 // tchar_t* -#define STREAM_PRAGMA_GET 0x98 // tchar_t* #define STREAM_ENUM_BASE 0x9A // tchar_t* -#define STREAM_PLAYING 0x9B // bool_t -#define STREAM_TIME 0xA0 // tick_t -#define STREAM_SCOUTING 0xAA // bool_t -#define STREAM_NO_PAUSE 0xAB // TODO: find a better solution... -#define STREAM_KIND 0xAD // fourcc_t #define STREAM_ISTTY 0xAF // bool_t -#define STREAM_FULL_URL 0x99 // tchar_t* -#define STREAM_TIMEOUT 0x94 // systick_t -#define STREAM_NATIVE_HANDLER 0x8F // void* -#define STREAM_DATE 0x8C // datetime_t #define STREAM_USERNAME 0x88 // tchar_t* #define STREAM_PASSWORD 0x89 // tchar_t* #define STREAM_PROXY_USERNAME 0xC0 // tchar_t* #define STREAM_PROXY_PASSWORD 0xC1 // tchar_t* #define STREAM_CACHE_CLASS 0xB4 // fourcc_t -#define STREAM_CACHING 0xB6 // bool_t - -#define STREAM_KIND_LOCAL 0 -#define STREAM_KIND_NETWORK 1 -#define STREAM_KIND_LIVE_FEED 2 #define SFLAG_RDONLY 0x1 #define SFLAG_WRONLY 0x2 @@ -74,17 +56,8 @@ #define SFLAG_SILENT 0x8 #define SFLAG_BUFFERED 0x10 // used only by StreamOpen helper function #define SFLAG_REOPEN 0x20 // private inside stream -#define SFLAG_NO_PRAGMA 0x40 -#define SFLAG_NO_PROXY 0x80 -#define SFLAG_NO_DELAY 0x100 -#define SFLAG_NO_RETRY 0x200 -#define SFLAG_HIDDEN 0x400 #define SFLAG_NO_CACHING 0x800 #define SFLAG_NON_BLOCKING 0x1000 // used only by StreamOpen helper function -#define SFLAG_CREATE_BLOCKING 0x2000 -#define SFLAG_FORCE_CACHING 0x4000 -#define SFLAG_LONGTERM_CACHING 0x8000 -#define SFLAG_RECONNECT 0x10000 #define MAX_NETWORK_PACKET 2048 @@ -94,12 +67,6 @@ #define SEEK_END 2 #endif -#ifndef EOF -#define EOF (-1) -#endif - -#define DIR_TIMEOUT 2 // 2 s - typedef struct stream { node Base; @@ -109,16 +76,6 @@ typedef struct stream } stream; -typedef struct memstream -{ - stream Base; - filepos_t VirtualOffset; - const uint8_t* Ptr; - size_t Pos; - size_t Size; - -} memstream; - #if defined(CONFIG_STDIO) #define STDIN_ID FOURCC('S','T','D','I') #define STDOUT_ID FOURCC('S','T','D','O') @@ -129,7 +86,7 @@ typedef struct streamdir { tchar_t FileName[MAXPATH]; tchar_t DisplayName[MAXPATH]; - filepos_t Size; + filepos_t Size; int Type; // from Exts, FTYPE_DIR for directory datetime_t ModifiedDate; @@ -184,11 +141,10 @@ typedef struct stream_vmt #define Stream_ResetReadTimeout(p,a) VMT_FUNC(p,stream_vmt)->ResetReadTimeout(p,a) //-------------------------------------------------------------------------- - + #define STREAMPROCESS_CLASS FOURCC('S','T','R','P') #define STREAMPROCESS_INPUT 0xB0 -#define STREAMPROCESS_DATAFEED 0xB1 //--------------------------------------------------------------------------- @@ -204,17 +160,7 @@ typedef struct stream_vmt //--------------------------------------------------------------------------- -#define RESOURCEDATA_ID FOURCC('R','E','S','F') -#define RESOURCEDATA_SIZE 0x100 -#define RESOURCEDATA_PTR 0x101 - -//--------------------------------------------------------------------------- - -FILE_DLL stream* GetStream(anynode*, const tchar_t* URL, int Flags); FILE_DLL stream* StreamOpen(anynode*, const tchar_t* URL, int Flags); FILE_DLL void StreamClose(stream*); -FILE_DLL bool_t StreamGenExts(anynode*,array* Exts, fourcc_t ClassFilter, const tchar_t* TypeFilter); -FILE_DLL char StreamExtType(anynode*, fourcc_t ClassFilter, const tchar_t *Ext); -FILE_DLL int StreamProtocolPriority(anynode*, const tchar_t* URL); #endif diff --git a/corec/corec/helpers/file/tools.c b/corec/corec/helpers/file/tools.c index 123fd8f5..7f715dc3 100644 --- a/corec/corec/helpers/file/tools.c +++ b/corec/corec/helpers/file/tools.c @@ -28,6 +28,7 @@ ****************************************************************************/ #include "file.h" +#include bool_t SetFileExt(tchar_t* URL, size_t URLLen, const tchar_t* Ext) { @@ -100,10 +101,6 @@ const tchar_t* GetProtocol(const tchar_t* URL, tchar_t* Proto, int ProtoLen, boo tcsncpy_s(Proto,ProtoLen,URL,s-URL); if (HasHost) { - if (tcsnicmp(URL,T("urlpart"),7)==0) - // skip this protocol for the Host checking - GetProtocol(URL+10,NULL,0,HasHost); - else *HasHost = tcsnicmp(URL,T("file"),4)!=0 && tcsnicmp(URL,T("conf"),3)!=0 && tcsnicmp(URL,T("res"),3)!=0 && @@ -129,18 +126,6 @@ const tchar_t* GetProtocol(const tchar_t* URL, tchar_t* Proto, int ProtoLen, boo return s; } -fourcc_t GetProtocolKind(anynode* AnyNode, tchar_t *Protocol) -{ - fourcc_t Class = NodeEnumClassStr(AnyNode,NULL,STREAM_CLASS,NODE_PROTOCOL,Protocol); - if (Class) - { - const nodeclass *NodeClass = NodeContext_FindClass(AnyNode,Class); - if (NodeClass) - return (fourcc_t)NodeClass_Meta(NodeClass,STREAM_KIND,META_PARAM_CUSTOM); - } - return 0; -} - bool_t SplitAddr(const tchar_t* URL, tchar_t* Peer, int PeerLen, tchar_t* Local, int LocalLen) { const tchar_t* p = NULL; @@ -528,263 +513,6 @@ int CheckExts(const tchar_t* URL, const tchar_t* Exts) return 0; } -int ScaleRound(int_fast32_t v,int_fast32_t Num,int_fast32_t Den) -{ - int64_t i; - if (!Den) - return 0; - i = (int64_t)v * Num; - if (i<0) - i-=Den/2; - else - i+=Den/2; - i/=Den; - return (int)i; -} - -void StreamLoginInfo(node* p, tchar_t* URL, bool_t Proxy) -{ - tchar_t LoginPass[MAXPATH]; - if (SplitAddr(URL,LoginPass,TSIZEOF(LoginPass),NULL,0)) - { - // extract the login:pass from the URL as there seems to be one - tchar_t *s,*t; - if (!Proxy) - { - Node_SetData(p,STREAM_FULL_URL,TYPE_STRING,URL); - - t = (tchar_t*)GetProtocol(URL,NULL,0,NULL); - s = tcschr(t,T('@')); - assert(s!=NULL); - ++s; - memmove(t, s, tcsbytes(s)); - } - - t = (tchar_t*)GetProtocol(LoginPass,NULL,0,NULL); - s=tcschr(t,T(':')); - if (s) - *s++ = 0; - - if (Proxy) - { - Node_SetData(p,STREAM_PROXY_PASSWORD,TYPE_STRING,s); - Node_SetData(p,STREAM_PROXY_USERNAME,TYPE_STRING,t); - } - else - { - Node_SetData(p,STREAM_PASSWORD,TYPE_STRING,s); - Node_SetData(p,STREAM_USERNAME,TYPE_STRING,t); - } - } - else - Node_RemoveData(p,STREAM_FULL_URL,TYPE_STRING); -} - -tchar_t* FirstSepar(const tchar_t *Path) -{ - tchar_t *s1, *s2; - s1 = tcschr(Path, '\\'); - s2 = tcschr(Path, '/'); - if (!s1 || (s2 && s2 < s1)) - s1 = s2; - return s1; -} - -void SplitURLLogin(const tchar_t *URL, tchar_t *UserName, size_t UserNameLen, tchar_t *Password, size_t PasswordLen, tchar_t *URL2, size_t URL2Len) -{ - tchar_t LoginPass[MAXPATH]; - if (SplitAddr(URL, LoginPass, TSIZEOF(LoginPass), NULL, 0)) - { - tchar_t *s,*t; - if (URL2) - { - tcscpy_s(URL2, URL2Len, URL); - t = (tchar_t*)GetProtocol(URL2,NULL,0,NULL); - s = tcschr(t,T('@')); - assert(s!=NULL); - ++s; - memmove(t, s, tcsbytes(s)); - } - - t = (tchar_t*)GetProtocol(LoginPass,NULL,0,NULL); - s=tcschr(t,T(':')); - if (s) - { - *s++ = 0; -// missing: resolving escape sequences - if (Password) - tcscpy_s(Password, PasswordLen, s); - } - else - tcsclr_s(Password, PasswordLen); - if (UserName) - tcscpy_s(UserName, UserNameLen, t); - } else { - tcsclr_s(UserName, UserNameLen); - tcsclr_s(Password, PasswordLen); - if (URL2) - tcscpy_s(URL2, URL2Len, URL); - } -} - -void SplitShare(const tchar_t *Path, tchar_t *Share, size_t ShareLen, tchar_t *Path2, size_t Path2Len) -{ - tchar_t *s1; - s1 = FirstSepar(Path); - if (s1 == Path) - { - Path++; - s1 = FirstSepar(Path); - } - if (s1) { - if (Share) - tcsncpy_s(Share, ShareLen, Path, s1 - Path); - if (Path2) - tcscpy_s(Path2, Path2Len, s1); - } else - { - if (Share) - tcscpy_s(Share, ShareLen, Path); - tcsclr_s(Path2, Path2Len); - } -} - -tchar_t *MergeURL(tchar_t *URL, size_t URLLen, const tchar_t *Protocol, const tchar_t *Host, int Port, const tchar_t *Path) -{ - *URL = 0; - if (Protocol && *Protocol) - stcatprintf_s(URL, URLLen, T("%s://"), Protocol); - if (Host && *Host) - { - stcatprintf_s(URL, URLLen, T("%s"), Host); - if (Port > 0) - stcatprintf_s(URL, URLLen, T(":%d"), Port); - } - if (Path && *Path) - { - if (FirstSepar(Path) == Path) - stcatprintf_s(URL, URLLen, T("%s"), Path); - else - stcatprintf_s(URL, URLLen, T("/%s"), Path); - } - return URL; -} - -tchar_t *GetIP(tchar_t *sIP, size_t IPLen, long IP) -{ - stprintf_s(sIP, IPLen, T("%d.%d.%d.%d"), (IP >> 24) & 0xFF, (IP >> 16) & 0xFF, (IP >> 8) & 0xFF, IP & 0xFF); - return sIP; -} - -void SplitURLParams(const tchar_t* URL, tchar_t* URL2, int URL2Len, tchar_t* Params, int ParamsLen) -{ - tchar_t* p; - p = tcschr(URL, '?'); - if (p) - { - if (URL2) - tcsncpy_s(URL2, URL2Len, URL, p-URL); - if (Params) - tcscpy_s(Params, ParamsLen, p); - } else - { - if (URL2) - tcscpy_s(URL2, URL2Len, URL); - if (Params) - *Params = 0; - } -} - -tchar_t *AddCacheURL(tchar_t* Out, size_t Len, const tchar_t *In) -{ - CheckRemoveCacheURL(&In); - if (!In || !*In) { - if (Out && Len) - *Out = 0; - } - else - stprintf_s(Out, Len, T("cache://%s"), In); - return Out; -} - -bool_t CheckRemoveCacheURL(const tchar_t** URL) -{ - if (*URL && !tcsncmp(*URL, T("cache://"), 8)) - { - *URL += 8; - return 1; - } - return 0; -} - -bool_t RemoveURLParam(tchar_t* URL, const tchar_t* Param) -{ - size_t l; - tchar_t *s1, *s2; - l = tcslen(Param); - if (!l) - return 0; - s1 = tcschr(URL, '?'); - if (!s1) - s1 = tcschr(URL, ';'); - while (s1) - { - s2 = tcschr(s1+1, '&'); - if (!s2) - s2 = tcschr(s1+1, ';'); - if (tcsncmp(s1+1, Param, l) == 0 && s1[l+1] == '=') - { - if (s2) - memcpy(s1+1, s2+1, (tcslen(s2)+1)*sizeof(tchar_t)); - else - *s1 = 0; - return 1; - } - s1 = s2; - } - return 0; -} - -err_t FileStat(nodecontext* p, const tchar_t* Path, streamdir* Item) -{ - err_t Result; - stream *s; - tchar_t Dir[MAXPATH]; - tchar_t NameExt[MAXPATH]; - tchar_t Ext[MAXPATH+2]; - size_t l; - SplitPath(Path, Dir, MAXPATH, NameExt, MAXPATH, Ext, MAXPATH); - if (*Ext) - { - if (!tcschr(NameExt,T('.'))) - SetFileExt(NameExt, MAXPATH, Ext); - else - { - tcscat_s(NameExt,TSIZEOF(NameExt),T(".")); - tcscat_s(NameExt,TSIZEOF(NameExt),Ext); - } - } - l = tcslen(Ext); - Ext[l] = ':'; - Ext[l + 1] = '1'; - Ext[l + 2] = '\0'; - s = GetStream(p, Dir, SFLAG_SILENT); - if (!s) - return ERR_FILE_NOT_FOUND; - Result = Stream_OpenDir(s, Dir, SFLAG_SILENT); - if (Result == ERR_NONE) { - do { - Result = Stream_EnumDir(s, Ext, 1, Item); - if (Result == ERR_NONE && tcscmp(Item->FileName, NameExt) == 0) - break; - } while (Result == ERR_NONE); - } - NodeDelete((node *) s); - if (Result != ERR_NONE) - Result = ERR_FILE_NOT_FOUND; - return Result; -} - extern const nodemeta BufStream_Class[]; extern const nodemeta MemStream_Class[]; extern const nodemeta Streams_Class[]; diff --git a/corec/corec/helpers/parser/buffer.c b/corec/corec/helpers/parser/buffer.c deleted file mode 100644 index b5d7f046..00000000 --- a/corec/corec/helpers/parser/buffer.c +++ /dev/null @@ -1,121 +0,0 @@ -/***************************************************************************** - * - * Copyright (c) 2008-2010, CoreCodec, Inc. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * * Neither the name of CoreCodec, Inc. nor the - * names of its contributors may be used to endorse or promote products - * derived from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY CoreCodec, Inc. ``AS IS'' AND ANY - * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL CoreCodec, Inc. BE LIABLE FOR ANY - * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - ****************************************************************************/ - -#include "parser.h" - -static size_t SizeAlign(size_t Total, size_t Align) -{ - if (!Align) - { - for (Align=16;Align<16384;Align<<=1) - if (Align*8 > Total) - break; - } - --Align; - return (Total + Align) & ~Align; -} - -void BufferClear(buffer* p) -{ - free(p->Begin); - p->End = NULL; - p->Begin = NULL; - p->Read = NULL; - p->Write = NULL; -} - -bool_t BufferAlloc(buffer* p, size_t Total, size_t Align) -{ - size_t Read = p->Read - p->Begin; - size_t Write = p->Write - p->Begin; - uint8_t* Begin; - - Total = SizeAlign(Total + SAFETAIL,Align); - Begin = (uint8_t*)realloc(p->Begin,Total); - if (!Begin) - return 0; - - p->Begin = Begin; - p->Read = Begin + Read; - p->Write = Begin + Write; - p->End = Begin + Total - SAFETAIL; - return 1; -} - -void BufferDrop(buffer* p) -{ - p->Write = p->Begin; - p->Read = p->Begin; -} - -uint8_t* BufferWrite(buffer* p, const void* Ptr, size_t Length, size_t Align) -{ - uint8_t* Write = p->Write + Length; - - if (Write > p->End && !BufferAlloc(p,Write-p->Begin,Align)) - return 0; - - Write = p->Write; - p->Write = Write+Length; - - if (Ptr) - memcpy(Write,Ptr,Length); - - return Write; -} - -const uint8_t* BufferRead(buffer* p, size_t Length) -{ - uint8_t* Read = p->Read; - - if (p->Write < Read + Length) - return NULL; - - p->Read = Read + Length; - return Read; -} - -void BufferPack(buffer* p, size_t Length) -{ - uint8_t* Read = p->Read + Length; - - if (p->Write > Read) - { - if (Read != p->Begin) - { - // move end part to the beginning - memmove(p->Begin,Read,p->Write - Read); - p->Write -= Read - p->Begin; - } - } - else - p->Write = p->Begin; - - p->Read = p->Begin; -} diff --git a/corec/corec/helpers/parser/buffer.h b/corec/corec/helpers/parser/buffer.h deleted file mode 100644 index 78fbbfb6..00000000 --- a/corec/corec/helpers/parser/buffer.h +++ /dev/null @@ -1,49 +0,0 @@ -/***************************************************************************** - * - * Copyright (c) 2008-2010, CoreCodec, Inc. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * * Neither the name of CoreCodec, Inc. nor the - * names of its contributors may be used to endorse or promote products - * derived from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY CoreCodec, Inc. ``AS IS'' AND ANY - * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL CoreCodec, Inc. BE LIABLE FOR ANY - * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - ****************************************************************************/ - -#ifndef __BUFFER_H -#define __BUFFER_H - -typedef struct buffer -{ - uint8_t* Begin; - uint8_t* Write; - uint8_t* Read; - uint8_t* End; - -} buffer; - -NODE_DLL void BufferClear(buffer*); -NODE_DLL void BufferDrop(buffer*); -NODE_DLL bool_t BufferAlloc(buffer* p, size_t Size, size_t Align); -NODE_DLL uint8_t* BufferWrite(buffer*, const void* Ptr, size_t Length, size_t Align); -NODE_DLL const uint8_t* BufferRead(buffer*, size_t Length); -NODE_DLL void BufferPack(buffer*, size_t Readed); - -#endif diff --git a/corec/corec/helpers/parser/dataheap.c b/corec/corec/helpers/parser/dataheap.c deleted file mode 100644 index 115c4e69..00000000 --- a/corec/corec/helpers/parser/dataheap.c +++ /dev/null @@ -1,374 +0,0 @@ -/***************************************************************************** - * - * Copyright (c) 2008-2010, CoreCodec, Inc. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * * Neither the name of CoreCodec, Inc. nor the - * names of its contributors may be used to endorse or promote products - * derived from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY CoreCodec, Inc. ``AS IS'' AND ANY - * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL CoreCodec, Inc. BE LIABLE FOR ANY - * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - ****************************************************************************/ - -#include "parser.h" - -// Don't use dataheap in win32 debug mode. It's easier to track down memory corruptions. -#if defined(NDEBUG) || !defined(TARGET_WIN32) -#define DATAHEAP_LIMIT 72 -#else -#define DATAHEAP_LIMIT 1 -#endif - -#ifdef MIPS64 -typedef uint64_t dataunit; -#else -typedef uintptr_t dataunit; -#endif - -#define BUFFER_SIZE 1024 //in dataunit - -#define DATAALIGN(n) (((n)+sizeof(dataunit)-1)/sizeof(dataunit)) - -static INLINE size_t DataSize(dataunit* i) { return (size_t)*i & 65535; } -static INLINE size_t DataNext(dataunit* i) { return (size_t)*i >> 16; } - -struct dataheap_free -{ - dataheap_free* Next; -}; - -typedef struct dataheap_block -{ - dataunit* Data; - uint16_t Count; - uint16_t MaxSize; - -} dataheap_block; - -#if 0 -static void DataHeap_Check(dataheap* p) -{ - dataheap_block* i; - size_t MaxSize=0; - - for (i=ARRAYBEGIN(p->Buffer,dataheap_block);i!=ARRAYEND(p->Buffer,dataheap_block);++i) - { - dataunit* a = i->Data; - dataunit* b = i->Data+BUFFER_SIZE-1; - size_t Count=0; - - assert(i->MaxSize>=MaxSize); - assert(!DataSize(a)); - assert(*b==0); - - while (a!=b) - { - if (i->MaxSize) - { - assert(DataSize(a)<=i->MaxSize); - if (DataSize(a)==i->MaxSize) - ++Count; - } - assert(DataSize(a)<=DataNext(a)); - assert(a+DataNext(a)<=b); - a += DataNext(a); - } - - MaxSize = i->MaxSize; - assert(!i->MaxSize || i->Count==Count); - } -} -#else -#define DataHeap_Check(p) {} -#endif - -static void DataHeap_Write(dataheap* UNUSED_PARAM(p),void* Ptr,const void* Src,size_t Pos,size_t Size) -{ - memcpy((uint8_t*)Ptr+Pos,Src,Size); -} - -static void* DataHeap_Alloc(dataheap* p, size_t Size, int UNUSED_PARAM(Flags)) -{ - dataheap_block Block; - dataheap_block* i; - dataunit* curr; - dataunit* prev; - size_t n,Count,MaxSize; - - if (!Size) - return NULL; - - Size = DATAALIGN(Size); - - if (Size>=DATAHEAP_LIMIT) - return MemHeap_Alloc(p->Heap,Size*sizeof(dataunit),0); - - if (Size==DATAALIGN(3*sizeof(void*))) - { - dataheap_free* hf; - if (!p->Free3) - { - Block.Count = 0; - Block.MaxSize = 0; - Block.Data = MemHeap_Alloc(p->Heap,BUFFER_SIZE*sizeof(dataunit),0); - if (!Block.Data) - goto failed; - - if (!ArrayInsert(&p->Buffer,0,&Block,sizeof(Block),256)) - goto failed_array; - - Block.Data[0] = (BUFFER_SIZE-1)<<16; // head delimiter - Block.Data[BUFFER_SIZE-1] = 0; // tail delimiter - - for (n=1;nNext = p->Free3; - p->Free3 = hf; - } - } - - hf=p->Free3; - p->Free3 = hf->Next; - return hf; - } - - DataHeap_Check(p); - - if (!ARRAYEMPTY(p->Buffer)) - { - for (;;) - { - i=ARRAYEND(p->Buffer,dataheap_block)-1; - if (i->MaxSizeCount?i->MaxSize:0; - Count=0; - - curr = i->Data; - do - { - prev = curr; - curr += DataNext(curr); - - if ((n = DataSize(curr)) >= Size) - { - if (n==i->MaxSize) - { - assert(i->Count>0); - i->Count = (uint16_t)(i->Count-1); - } - - if (n == Size) - *prev += DataNext(curr) << 16; - else - { - *prev += Size << 16; - curr[Size] = (n-Size) | ((DataNext(curr)-Size)<<16); - } - - return curr; - } - - if (MaxSize<=n) - { - if (MaxSize==n) - ++Count; - else - { - MaxSize=n; - Count=1; - } - } - } - while (n); - - assert(i->Count==0); - - i->Count = (uint16_t)Count; - i->MaxSize = (uint16_t)MaxSize; - while (i!=ARRAYBEGIN(p->Buffer,dataheap_block) && i[-1].MaxSize > i->MaxSize) - { - SWAPVAL(dataheap_block,i[-1],i[0]); - --i; - } - } - } - - Block.Data = MemHeap_Alloc(p->Heap,BUFFER_SIZE*sizeof(dataunit),0); - if (!Block.Data) - goto failed; - - if (!ArrayAppend(&p->Buffer,&Block,sizeof(Block),256)) - goto failed_array; - - MaxSize = BUFFER_SIZE-2-Size; - - i = ARRAYEND(p->Buffer,dataheap_block)-1; - i->Count = 1; - i->MaxSize = (uint16_t)MaxSize; - - curr = i->Data; - curr[0] = (1+Size)<<16; // head delimiter - curr[1+Size] = MaxSize + (MaxSize<<16); - curr[BUFFER_SIZE-1] = 0; // tail delimiter - - while (i!=ARRAYBEGIN(p->Buffer,dataheap_block) && i[-1].MaxSize > i->MaxSize) - { - SWAPVAL(dataheap_block,i[-1],i[0]); - --i; - } - - return curr+1; - -failed_array: - MemHeap_Free(p->Heap,Block.Data,BUFFER_SIZE*sizeof(dataunit)); -failed: - return NULL; -} - -static void DataHeap_Free(dataheap* p, void* Ptr, size_t Size) -{ - if (Ptr && Size) - { - dataunit *curr = (dataunit*)Ptr; - dataunit *next; - dataunit *prev; - dataheap_block* i; - - Size = DATAALIGN(Size); - - if (Size>=DATAHEAP_LIMIT) - { - MemHeap_Free(p->Heap,Ptr,Size*sizeof(dataunit)); - return; - } - - if (Size==3) - { - ((dataheap_free*)Ptr)->Next = p->Free3; - p->Free3 = (dataheap_free*)Ptr; - return; - } - - for (i=ARRAYEND(p->Buffer,dataheap_block);i!=ARRAYBEGIN(p->Buffer,dataheap_block);) - { - --i; - if (i->Data < curr && i->Data+BUFFER_SIZE > curr) - { - DataHeap_Check(p); - - next = i->Data; - do - { - prev = next; - next += DataNext(next); - } - while (next i->MaxSize) - { - i->MaxSize = (uint16_t)Size; - i->Count = 1; - - while (++i!=ARRAYEND(p->Buffer,dataheap_block) && i[-1].MaxSize > i->MaxSize) - { - SWAPVAL(dataheap_block,i[-1],i[0]); - } - } - else - if (Size == i->MaxSize) - i->Count = (uint16_t)(i->Count+1); - - DataHeap_Check(p); - break; - } - } - } -} - -static void* DataHeap_ReAlloc(dataheap* p, void* Old, size_t OldSize, size_t NewSize) -{ - size_t n; - void* New; - - OldSize = DATAALIGN(OldSize)*sizeof(dataunit); - NewSize = DATAALIGN(NewSize)*sizeof(dataunit); - - if (OldSize == NewSize) - return Old; - - if (DATAHEAP_LIMIT*sizeof(dataunit)<=OldSize && DATAHEAP_LIMIT*sizeof(dataunit)<=NewSize) - return MemHeap_ReAlloc(p->Heap,Old,OldSize,NewSize); - - New = DataHeap_Alloc(p,NewSize,0); - - if (!New && NewSize) - return NULL; // failed - - if (Old && New) - { - n = min(OldSize,NewSize); - memcpy(New,Old,n); - } - - DataHeap_Free(p,Old,OldSize); - return New; -} - -void DataHeap_Init(dataheap* p,const cc_memheap* Heap) -{ - assert(BUFFER_SIZE-2>=DATAHEAP_LIMIT); - p->Base.Alloc = (memheap_alloc)DataHeap_Alloc; - p->Base.ReAlloc = (memheap_realloc)DataHeap_ReAlloc; - p->Base.Free = (memheap_free)DataHeap_Free; - p->Base.Write = (memheap_write)DataHeap_Write; - p->Base.Null.Heap = &p->Base; - p->Base.Null.Size = DATA_FLAG_MEMHEAP; - p->Heap = Heap; - ArrayInitEx(&p->Buffer,Heap); - ArrayAlloc(&p->Buffer,512,1); - p->Free3 = NULL; -} - -void DataHeap_Done(dataheap* p) -{ - dataheap_block* i; - for (i=ARRAYBEGIN(p->Buffer,dataheap_block);i!=ARRAYEND(p->Buffer,dataheap_block);++i) - MemHeap_Free(p->Heap,i->Data,BUFFER_SIZE*sizeof(dataunit)); - ArrayClear(&p->Buffer); - p->Free3 = NULL; -} diff --git a/corec/corec/helpers/parser/dataheap.h b/corec/corec/helpers/parser/dataheap.h deleted file mode 100644 index 8ae42486..00000000 --- a/corec/corec/helpers/parser/dataheap.h +++ /dev/null @@ -1,47 +0,0 @@ -/***************************************************************************** - * - * Copyright (c) 2008-2010, CoreCodec, Inc. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * * Neither the name of CoreCodec, Inc. nor the - * names of its contributors may be used to endorse or promote products - * derived from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY CoreCodec, Inc. ``AS IS'' AND ANY - * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL CoreCodec, Inc. BE LIABLE FOR ANY - * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - ****************************************************************************/ - -#ifndef __DATAHEAP_H -#define __DATAHEAP_H - -typedef struct dataheap_free dataheap_free; - -typedef struct dataheap -{ - cc_memheap Base; - const cc_memheap *Heap; - array Buffer; - dataheap_free* Free3; // optimize the most common sized chunk (sizeof(nodenotif) and sizeof(nodedata)+4) - -} dataheap; - -NODE_DLL void DataHeap_Init(dataheap*, const cc_memheap* Base); -NODE_DLL void DataHeap_Done(dataheap*); - -#endif diff --git a/corec/corec/helpers/parser/hotkey.c b/corec/corec/helpers/parser/hotkey.c deleted file mode 100644 index 0555942e..00000000 --- a/corec/corec/helpers/parser/hotkey.c +++ /dev/null @@ -1,179 +0,0 @@ -/***************************************************************************** - * - * Copyright (c) 2008-2010, CoreCodec, Inc. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * * Neither the name of CoreCodec, Inc. nor the - * names of its contributors may be used to endorse or promote products - * derived from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY CoreCodec, Inc. ``AS IS'' AND ANY - * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL CoreCodec, Inc. BE LIABLE FOR ANY - * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - ****************************************************************************/ - -#include "parser.h" - -typedef struct hotkeyname -{ - uint32_t Key; - const tchar_t* XML; - -} hotkeyname; - -static const hotkeyname HotKeyName[] = -{ - // first the masks - { HOTKEY_SHIFT, T("Shift")}, - { HOTKEY_CTRL, T("Ctrl")}, - { HOTKEY_ALT, T("Alt")}, - { HOTKEY_WIN, T("Win")}, - { HOTKEY_HOLD, T("Hold")}, - - { HOTKEY_MEDIA_STOP, T("Stop")}, - { HOTKEY_MEDIA_PLAY, T("Play")}, - { HOTKEY_MEDIA_PREV, T("Prev")}, - { HOTKEY_MEDIA_NEXT, T("Next")}, - { HOTKEY_MEDIA_VOLUME_UP, T("VolUp")}, - { HOTKEY_MEDIA_VOLUME_DOWN, T("VolDown")}, - { HOTKEY_MEDIA_MUTE, T("Mute")}, - { HOTKEY_MEDIA_MOVEFWD, T("MoveFwd")}, - { HOTKEY_MEDIA_MOVEBACK, T("MoveBack")}, - - { HOTKEY_DPAD_ACTION, T("Action")}, - { HOTKEY_DPAD_LEFT, T("Left")}, - { HOTKEY_DPAD_RIGHT, T("Right")}, - { HOTKEY_DPAD_UP, T("Up")}, - { HOTKEY_DPAD_DOWN, T("Down")}, - - { HOTKEY_ENTER, T("Enter")}, - { HOTKEY_SPACE, T("Space")}, - { HOTKEY_ESCAPE, T("Escape")}, - { HOTKEY_TABNEXT, T("TabNext")}, - { HOTKEY_TABPREV, T("TabPrev")}, - { HOTKEY_BACKSPACE, T("BackSpace")}, - { HOTKEY_DELETE, T("Delete")}, - - { HOTKEY_SELECT, T("Select")}, - { HOTKEY_START, T("Start")}, - { HOTKEY_TRIANGLE, T("Triangle")}, - { HOTKEY_SQUARE, T("Square")}, - { HOTKEY_CIRCLE, T("Circle")}, - { HOTKEY_CROSS, T("Cross")}, - - {0, NULL}, - - // should be right after {0} - { HOTKEY_APP_FIRST, T("App%d")}, -}; - -static const tchar_t* GetHotKeyName(const hotkeyname* i, hotkeygetname GetName, void* GetNameParam) -{ - if (GetName) - return GetName(GetNameParam,i->Key); - return i->XML; -} - -void HotKeyToString(tchar_t* Out, size_t OutLen, uint32_t HotKey, hotkeygetname GetName, void* GetNameParam) -{ - const hotkeyname* i = HotKeyName; - if (!GetName) - { - // force # XML exporting to make import safer... - stprintf_s(Out,OutLen,T("#%x"),(int)HotKey); - return; - } - - *Out = 0; - - for (;i->Key > HOTKEY_MASK;++i) - if (HotKey & i->Key) - { - tcscat_s(Out,OutLen,GetHotKeyName(i,GetName,GetNameParam)); - tcscat_s(Out,OutLen,T("+")); - } - - HotKey &= HOTKEY_MASK; - - for (;i->Key;++i) - if (HotKey == i->Key) - { - tcscat_s(Out,OutLen,GetHotKeyName(i,GetName,GetNameParam)); - return; - } - - if ((HotKey >= '0' && HotKey <= '9') || (HotKey >= 'A' && HotKey <= 'Z')) - stcatprintf_s(Out,OutLen,T("%c"),HotKey); - else - if (HotKey >= HOTKEY_FUNC_FIRST && HotKey <= HOTKEY_FUNC_LAST) - stcatprintf_s(Out,OutLen,T("F%d"),HotKey-HOTKEY_FUNC_FIRST+1); - else - if (HotKey >= HOTKEY_APP_FIRST && HotKey <= HOTKEY_APP_LAST) - stcatprintf_s(Out,OutLen,GetHotKeyName(i+1,GetName,GetNameParam),HotKey-HOTKEY_APP_FIRST+1); - else - stcatprintf_s(Out,OutLen,T("#%02X"),HotKey); -} - -uint32_t StringToHotKey(const tchar_t* In) -{ - const tchar_t* m; - const hotkeyname* i; - uint32_t HotKey = 0; - size_t n; - - ExprSkipSpace(&In); - - while ((m = tcschr(In,'+')) != NULL) - { - n = m-In; - while (n>0 && IsSpace(In[n-1])) - --n; - - for (i = HotKeyName;i->Key > HOTKEY_MASK;++i) - if (tcsnicmp(In,i->XML,n)==0) - { - HotKey |= i->Key; - break; - } - - In = m+1; - } - - if (!In[0]) - return 0; - - for (i = HotKeyName;i->Key;++i) - if (tcsisame_ascii(In,i->XML)) - return HotKey | i->Key; - - if ((In[0] == 'f' || In[0] == 'F') && IsDigit(In[1])) - return HotKey | (HOTKEY_FUNC_FIRST + StringToInt(In+1,0) - 1); - - if (In[0] == '#') - return HotKey | StringToInt(In+1,1); - - n = tcslen(In); - if (n>1 && IsDigit(In[n-1])) - { - while (n>0 && IsDigit(In[n-1])) - --n; - return HotKey | (HOTKEY_APP_FIRST + StringToInt(In+n,0) - 1); - } - - return HotKey | In[0]; -} diff --git a/corec/corec/helpers/parser/hotkey.h b/corec/corec/helpers/parser/hotkey.h deleted file mode 100644 index fe7272de..00000000 --- a/corec/corec/helpers/parser/hotkey.h +++ /dev/null @@ -1,90 +0,0 @@ -/***************************************************************************** - * - * Copyright (c) 2008-2010, CoreCodec, Inc. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * * Neither the name of CoreCodec, Inc. nor the - * names of its contributors may be used to endorse or promote products - * derived from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY CoreCodec, Inc. ``AS IS'' AND ANY - * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL CoreCodec, Inc. BE LIABLE FOR ANY - * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - ****************************************************************************/ - -#ifndef __HOTKEY_H -#define __HOTKEY_H - -#define HOTKEY_MASK 0x0000FFFF -#define HOTKEY_SHIFT 0x00010000 -#define HOTKEY_CTRL 0x00020000 -#define HOTKEY_ALT 0x00040000 -#define HOTKEY_WIN 0x00080000 -#define HOTKEY_HOLD 0x00100000 - -#define HOTKEY_MEDIA_STOP 0x00009000 -#define HOTKEY_MEDIA_PLAY 0x00009001 -#define HOTKEY_MEDIA_PREV 0x00009002 -#define HOTKEY_MEDIA_NEXT 0x00009003 -#define HOTKEY_MEDIA_VOLUME_UP 0x00009004 -#define HOTKEY_MEDIA_VOLUME_DOWN 0x00009005 -#define HOTKEY_MEDIA_MUTE 0x00009006 -#define HOTKEY_MEDIA_MOVEFWD 0x00009007 -#define HOTKEY_MEDIA_MOVEBACK 0x00009008 - -#define HOTKEY_DPAD_ACTION 0x00009010 -#define HOTKEY_DPAD_LEFT 0x00009011 -#define HOTKEY_DPAD_RIGHT 0x00009012 -#define HOTKEY_DPAD_UP 0x00009013 -#define HOTKEY_DPAD_DOWN 0x00009014 - -#define HOTKEY_ENTER 0x00009020 -#define HOTKEY_SPACE 0x00009021 -#define HOTKEY_ESCAPE 0x00009022 -#define HOTKEY_TABNEXT 0x00009023 -#define HOTKEY_TABPREV 0x00009024 -#define HOTKEY_DELETE 0x00009025 -#define HOTKEY_BACKSPACE 0x00009026 - -#define HOTKEY_FUNC_FIRST 0x00009030 -#define HOTKEY_FUNC_LAST 0x0000903F - -#define HOTKEY_APP_FIRST 0x00009040 -#define HOTKEY_APP_LAST 0x0000904F - -#define HOTKEY_MOD_SHIFT 0x00009050 -#define HOTKEY_MOD_CTRL 0x00009051 -#define HOTKEY_MOD_ALT 0x00009052 -#define HOTKEY_MOD_WIN 0x00009053 - -#define KEYPAD_KEY_FIRST 0x00009060 -#define KEYPAD_KEY_LAST 0x0000906F - -#define HOTKEY_SELECT 0x00009080 -#define HOTKEY_START 0x00009081 -#define HOTKEY_TRIANGLE 0x00009082 -#define HOTKEY_SQUARE 0x00009083 -#define HOTKEY_CIRCLE 0x00009084 -#define HOTKEY_CROSS 0x00009085 - -typedef const tchar_t* (*hotkeygetname)(void* Param,uint32_t Key); - -NODE_DLL void HotKeyToString(tchar_t* Out, size_t OutLen, uint32_t HotKey, hotkeygetname GetName, void* GetNameParam); -NODE_DLL uint32_t StringToHotKey(const tchar_t* In); - -#endif diff --git a/corec/corec/helpers/parser/nodelookup.c b/corec/corec/helpers/parser/nodelookup.c deleted file mode 100644 index 5c8a62f4..00000000 --- a/corec/corec/helpers/parser/nodelookup.c +++ /dev/null @@ -1,125 +0,0 @@ -/***************************************************************************** - * - * Copyright (c) 2008-2010, CoreCodec, Inc. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * * Neither the name of CoreCodec, Inc. nor the - * names of its contributors may be used to endorse or promote products - * derived from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY CoreCodec, Inc. ``AS IS'' AND ANY - * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL CoreCodec, Inc. BE LIABLE FOR ANY - * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - ****************************************************************************/ - -#include "parser.h" - -typedef struct nodelookup -{ - const tchar_t* Name; - node* Node; - -} nodelookup; - -static int CmpLookup(const void* UNUSED_PARAM(p), const void* va, const void* vb) -{ - const nodelookup* a = va; - const nodelookup* b = vb; - return tcsicmp_ascii(a->Name,b->Name); -} - -void NodeLookup_AddSingletons(array* p, nodecontext* Context) -{ - array List; - node** i; - - NodeEnumSingletons(Context,&List); - for (i=ARRAYBEGIN(List,node*);i!=ARRAYEND(List,node*);++i) - NodeLookup_Add(p,*i,NodeParamStr(*i,NODE_ID)); - ArrayClear(&List); -} - -bool_t NodeLookup_Exists(array* p, const tchar_t* Name) -{ - assert(Name != NULL); - if (Name && Name[0]) - { - bool_t Found; - nodelookup Lookup; - Lookup.Name = Name; - ArrayFind(p,nodelookup,&Lookup,CmpLookup,NULL,&Found); - return Found; - } - return 0; -} - -node* NodeLookup_FindUnique(array* p, const tchar_t* Name) -{ - assert(Name!=NULL); - if (Name && Name[0]) - { - bool_t Found; - size_t Pos; - nodelookup Lookup; - Lookup.Name = Name; - Pos = ArrayFind(p,nodelookup,&Lookup,CmpLookup,NULL,&Found); - if (Found) - return ARRAYBEGIN(*p,nodelookup)[Pos].Node; - } - return NULL; -} - -bool_t NodeLookup_Add(array* p, node* Node, const tchar_t* Name) -{ - if (Name && Name[0]) - { - bool_t Found; - size_t Pos; - nodelookup Lookup; - - Lookup.Name = Name; - Lookup.Node = Node; - - Pos = ArrayFind(p,nodelookup,&Lookup,CmpLookup,NULL,&Found); - if (!Found) - { - ArrayAdd(p,nodelookup,&Lookup,CmpLookup,NULL,0); - return 1; - } - else - ARRAYBEGIN(*p,nodelookup)[Pos].Node = NULL; - } - return 0; -} - -void NodeLookup_Remove(array* p, node* Node, const tchar_t* Name) -{ - if (Name && Name[0]) - { - bool_t Found; - size_t Pos; - nodelookup Lookup; - - Lookup.Name = Name; - Lookup.Node = Node; - - Pos = ArrayFind(p,nodelookup,&Lookup,CmpLookup,NULL,&Found); - if (Found) - ArrayDelete(p,Pos*sizeof(Lookup),sizeof(Lookup)); - } -} diff --git a/corec/corec/helpers/parser/nodelookup.h b/corec/corec/helpers/parser/nodelookup.h deleted file mode 100644 index 96a697c7..00000000 --- a/corec/corec/helpers/parser/nodelookup.h +++ /dev/null @@ -1,39 +0,0 @@ -/***************************************************************************** - * - * Copyright (c) 2008-2010, CoreCodec, Inc. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * * Neither the name of CoreCodec, Inc. nor the - * names of its contributors may be used to endorse or promote products - * derived from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY CoreCodec, Inc. ``AS IS'' AND ANY - * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL CoreCodec, Inc. BE LIABLE FOR ANY - * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - ****************************************************************************/ - -#ifndef __NODELOOKUP_H -#define __NODELOOKUP_H - -NODE_DLL void NodeLookup_AddSingletons(array*, nodecontext*); -NODE_DLL bool_t NodeLookup_Add(array*, node*, const tchar_t* Id); -NODE_DLL bool_t NodeLookup_Exists(array*, const tchar_t* Id); -NODE_DLL node* NodeLookup_FindUnique(array*, const tchar_t* Id); -NODE_DLL void NodeLookup_Remove(array*,node*,const tchar_t *Id); - -#endif diff --git a/corec/corec/helpers/parser/parser.h b/corec/corec/helpers/parser/parser.h index df27aa5a..24f49048 100644 --- a/corec/corec/helpers/parser/parser.h +++ b/corec/corec/helpers/parser/parser.h @@ -1,5 +1,5 @@ /***************************************************************************** - * + * * Copyright (c) 2008-2010, CoreCodec, Inc. * All rights reserved. * @@ -30,20 +30,13 @@ #ifndef __PARSER_H #define __PARSER_H -#include "corec/helpers/file/file.h" -#include "corec/helpers/charconvert/charconvert.h" +#include +#include #ifdef __cplusplus extern "C" { #endif -#include "dataheap.h" -#include "strtab.h" -#include "strtypes.h" -#include "hotkey.h" -#include "buffer.h" -#include "nodelookup.h" -#include "urlpart.h" #define LANG_STRINGS_ID FOURCC('L','N','G','S') @@ -51,21 +44,25 @@ extern "C" { #define MAXLINE 1024 #define BIGLINE 16 * 1024 -#define Parser_Context(p) ((parsercontext*)Node_Context(p)) +typedef struct strtab +{ + const struct cc_memheap* Heap; + array Table; + +} strtab; typedef struct parsercontext { nodecontext Base; - charconv* ToUTF8; - charconv* FromUTF8; - charconv* ToStr; - charconv* FromStr; - charconv* ToWcs; - charconv* FromWcs; - charconv* ToUtf16; - charconv* FromUtf16; + struct charconv* ToUTF8; + struct charconv* FromUTF8; + struct charconv* ToStr; + struct charconv* FromStr; + struct charconv* ToWcs; + struct charconv* FromWcs; + struct charconv* ToUtf16; + struct charconv* FromUtf16; strtab StrTab; - bool_t LowStartMemory; } parsercontext; @@ -81,90 +78,12 @@ NODE_DLL void Node_FromWcs(anynode*, tchar_t* Out,size_t OutLen, const wchar_t*) NODE_DLL void Node_ToUTF16(anynode*, utf16_t* Out,size_t OutLen, const tchar_t*); NODE_DLL void Node_FromUTF16(anynode*, tchar_t* Out,size_t OutLen, const utf16_t*); -typedef bool_t (*exprmacro)(void* Cookie, const tchar_t* Name, size_t NameLen, tchar_t* Out, size_t OutLen); - -typedef struct exprstate -{ - nodecontext* Context; - node* Base; - cc_point CoordScale; - fourcc_t ClassId; - const tchar_t* EnumList; - exprmacro MacroFunc; - void* MacroCookie; - array NodeLookup; - -} exprstate; - -NODE_DLL void ExprState(exprstate* State, node*, dataid Id, dataflags Flags); - -typedef err_t (*parserexpradd)(node* Node, const datadef* DataDef, exprstate* State, const tchar_t* Expr, bool_t Save); - -typedef struct parser -{ - parsercontext *Context; - stream* Stream; - buffer Buffer; - charconv* CC; - charconv* EscapeCC; - tchar_t *BigLine; - boolmem_t Element; - boolmem_t ElementEof; - boolmem_t URL; - boolmem_t OwnCC; - boolmem_t Error; - -} parser; - -NODE_DLL err_t ParserStream(parser*, stream* Stream, parsercontext* Context); -NODE_DLL err_t ParserStreamXML(parser*, stream* Stream, parsercontext* Context, const tchar_t* Root, bool_t NeedRootAttribs); -NODE_DLL void ParserCC(parser*, charconv* CC, bool_t OwnCC); -NODE_DLL void ParserBOM(parser*); - -NODE_DLL err_t ParserFill(parser*,size_t AdditionalNeeded); // non-blocking stream could return ERR_NEED_MORE_DATA -NODE_DLL err_t ParserFillLine(parser*); // non-blocking stream could return ERR_NEED_MORE_DATA -NODE_DLL void ParserDataFeed(parser* p,const void* Ptr,size_t Len); -NODE_DLL err_t ParserSkip(parser*, intptr_t* Skip); -NODE_DLL err_t ParserRead(parser*, void* Data, size_t Size, size_t* Readed); -NODE_DLL err_t ParserReadEx(parser*, void* Data, size_t Size, size_t* Readed, bool_t Fill); -NODE_DLL intptr_t ParserReadUntil(parser* p, tchar_t* Out, size_t OutLen, int Delimiter); -NODE_DLL void ParserSkipAfter(parser* p, int Delimiter); -NODE_DLL bool_t ParserLine(parser*, tchar_t* Out, size_t OutLen); -NODE_DLL bool_t ParserBigLine(parser*); -NODE_DLL bool_t ParserIsToken(parser*, const tchar_t* Token); // case insensitive, ascii -NODE_DLL bool_t ParserIsFormat(parser*, const tchar_t* Name, void *Value); -NODE_DLL const uint8_t* ParserPeek(parser*, size_t Len); -NODE_DLL const uint8_t* ParserPeekEx(parser*, size_t Len, bool_t Fill, err_t*); - -NODE_DLL bool_t ParserIsRootElement(parser*, tchar_t* Root, size_t RootLen); -NODE_DLL bool_t ParserIsElement(parser*, tchar_t* Name, size_t NameLen); -NODE_DLL bool_t ParserIsElementNested(parser*, tchar_t* Name, size_t NameLen); -NODE_DLL bool_t ParserElementContent(parser*, tchar_t* Out, size_t OutLen); -/** Skip all the attributes of the current element and position after the '>' */ -NODE_DLL void ParserElementSkip(parser* p); -NODE_DLL void ParserElementSkipNested(parser* p); - -NODE_DLL bool_t ParserIsAttrib(parser*, tchar_t* Name, size_t NameLen); -NODE_DLL bool_t ParserAttribString(parser*, tchar_t* Out, size_t OutLen); -NODE_DLL bool_t ParserAttrib(parser*, void* Data, size_t Size, dataflags Flags, exprstate* State); -NODE_DLL bool_t ParserAttribData(parser*, node* Node, const datadef* DataDef, exprstate* State, parserexpradd ExprAdd, bool_t ExprSave); -NODE_DLL bool_t ParserValueData(const tchar_t* Value, node* Node, const datadef* DataDef, exprstate* State, parserexpradd ExprAdd, bool_t ExprSave); -NODE_DLL bool_t ParserAttribLangStr(parser* p, parsercontext* Context, fourcc_t Class, dataid Id); -NODE_DLL void ParserAttribSkip(parser*); - - -NODE_DLL void ParserHTMLChars(parser*,tchar_t*,size_t); -NODE_DLL void ParserHTMLToURL(tchar_t*,size_t); - -NODE_DLL void ParserURLToHTML(tchar_t*,size_t); - -NODE_DLL void ParserImport(parser* Parser,node* Node); -NODE_DLL void ParserImportNested(parser* Parser,node* Node); +typedef struct stream stream; typedef struct textwriter { stream* Stream; - charconv* CC; + struct charconv* CC; bool_t SafeFormat; // use instead of // private @@ -190,19 +109,12 @@ NODE_DLL void TextAttrib(textwriter*, const tchar_t* Name, const void* Data, dat NODE_DLL void TextAttribEx(textwriter*,const tchar_t* Name, const void* Data, size_t Size, dataflags Type); NODE_DLL void TextSerializeNode(textwriter* Text, node* p, uint_fast32_t Mask, uint_fast32_t Filter); -NODE_DLL bool_t StringToPin(pin* Data, datadef* DataDef, exprstate* State, const tchar_t** Expr); -NODE_DLL bool_t StringToNode(node** Data, exprstate* State, const tchar_t** Expr); -NODE_DLL bool_t StringToData(void* Data, size_t Size, dataflags Type, exprstate* State, const tchar_t* Value); NODE_DLL bool_t DataToString(tchar_t* Value, size_t ValueLen, const void* Data, size_t Size, dataflags Type); -NODE_DLL bool_t PinToString(tchar_t* Value, size_t ValueLen, const pin* Data, node* Base); NODE_DLL bool_t NodeToString(tchar_t* Value, size_t ValueLen, node* Node, node* Base); -NODE_DLL void ExprSkipSpace(const tchar_t** p); +void ExprSkipSpace(const tchar_t** p); NODE_DLL void ExprTrimSpace(tchar_t** p); -NODE_DLL bool_t ExprCmd(const tchar_t** Expr, tchar_t* Out, size_t OutLen); NODE_DLL bool_t ExprSkipAfter(const tchar_t** p,int ch); //ch=0 for general space -NODE_DLL bool_t ExprIsToken(const tchar_t** p,const tchar_t* Name); -NODE_DLL bool_t ExprIsTokenEx(const tchar_t** p,const tchar_t* Name,...); NODE_DLL bool_t ExprIsSymbol(const tchar_t** p,int ch); NODE_DLL bool_t ExprIsSymbol2(const tchar_t** p,int ch, int ch2); NODE_DLL void ExprParamEnd(const tchar_t** p); @@ -215,7 +127,6 @@ NODE_DLL bool_t ExprIsInt64Ex(const tchar_t** p,int size,int64_t*); // no space NODE_DLL bool_t ExprIsHex(const tchar_t** p,intptr_t*); // no space skipping! NODE_DLL bool_t ExprIsRGB(const tchar_t** p,intptr_t*); // no space skipping! NODE_DLL bool_t ExprIsFourCC(const tchar_t** p,intptr_t*); // no space skipping! -NODE_DLL bool_t ExprIsPoint(const tchar_t** p,cc_point*); NODE_DLL bool_t ExprIsName(const tchar_t** p,tchar_t* Out,size_t OutLen, const tchar_t* Delimiter); NODE_DLL size_t ExprIsBase64(const tchar_t** p,uint8_t* Out,size_t OutSize); @@ -223,7 +134,6 @@ NODE_DLL void SimplifyFrac(cc_fraction*, int64_t Num, int64_t Den); NODE_DLL void DoubleToFrac(cc_fraction*, int64_t v); NODE_DLL bool_t BufferToBase64(tchar_t *Out, size_t OutLen, const uint8_t *Buffer, size_t BufferSize); -NODE_DLL uint32_t StringToIP(const tchar_t *Addr); NODE_DLL err_t Stream_Printf(stream*, const tchar_t* Msg,...) #if defined(__GNUC__) && !defined(_MSC_VER) && !defined(UNICODE) diff --git a/corec/corec/helpers/parser/parser2.c b/corec/corec/helpers/parser/parser2.c index 0e930f6f..81070ceb 100644 --- a/corec/corec/helpers/parser/parser2.c +++ b/corec/corec/helpers/parser/parser2.c @@ -28,9 +28,15 @@ ****************************************************************************/ #include "parser.h" +#include "strtypes.h" +#include "strtab.h" +#include +#include +#include + +#define Parser_Context(p) ((parsercontext*)Node_Context(p)) extern const nodemeta LangStr_Class[]; -extern const nodemeta UrlPart_Class[]; static const tchar_t* ExternalStr(nodecontext* p,fourcc_t Class,int Id) { @@ -52,7 +58,6 @@ void ParserContext_Init(parsercontext* p,const nodemeta* Custom, const cc_memhea p->FromUtf16 = CharConvOpen(CHARSET_UTF16,NULL); NodeRegisterClassEx(&p->Base.Base,LangStr_Class); - NodeRegisterClassEx(&p->Base.Base,UrlPart_Class); CoreC_FileInit(&p->Base.Base); } @@ -81,1426 +86,181 @@ void ParserContext_Done(parsercontext* p) void Node_ToUTF8(anynode* p, char* Out,size_t OutLen, const tchar_t* In) { CharConvST(Parser_Context(p)->ToUTF8,Out,OutLen,In); -} - -void Node_FromUTF8(anynode* p, tchar_t* Out,size_t OutLen, const char* In) -{ - CharConvTS(Parser_Context(p)->FromUTF8,Out,OutLen,In); -} - -void Node_ToStr(anynode* p, char* Out,size_t OutLen, const tchar_t* In) -{ - CharConvST(Parser_Context(p)->ToStr,Out,OutLen,In); -} - -void Node_FromStr(anynode* p, tchar_t* Out,size_t OutLen, const char* In) -{ - CharConvTS(Parser_Context(p)->FromStr,Out,OutLen,In); -} - -void Node_ToWcs(anynode* p, wchar_t* Out,size_t OutLen, const tchar_t* In) -{ - CharConvWT(Parser_Context(p)->ToWcs,Out,OutLen,In); -} - -void Node_FromWcs(anynode* p, tchar_t* Out,size_t OutLen, const wchar_t* In) -{ - CharConvTW(Parser_Context(p)->FromWcs,Out,OutLen,In); -} - -void Node_ToUTF16(anynode* p, utf16_t* Out,size_t OutLen, const tchar_t* In) -{ - CharConvUT(Parser_Context(p)->ToUtf16,Out,OutLen,In); -} - -void Node_FromUTF16(anynode* p, tchar_t* Out,size_t OutLen, const utf16_t* In) -{ - CharConvTU(Parser_Context(p)->FromUtf16,Out,OutLen,In); -} - -void ParserDataFeed(parser* p,const void* Ptr,size_t Len) -{ - BufferWrite(&p->Buffer,Ptr,Len,4096); -} - -NOINLINE err_t ParserFill(parser* p,size_t Needed) -{ - // Needed may be zero (see http.c EnumDir()) - - // pack buffer if more then half is done - if (p->Buffer.Read > p->Buffer.Begin + (p->Buffer.End - p->Buffer.Begin)/2) - BufferPack(&p->Buffer,0); - - for (;;) - { - size_t Readed,n; - err_t Err; - - n = p->Buffer.End - p->Buffer.Write; - if (n==0 || !p->Stream) - return (Needed>0)?ERR_NEED_MORE_DATA:ERR_NONE; - - Err = Stream_ReadOneOrMore(p->Stream,p->Buffer.Write,n,&Readed); - if (!Readed) - return Err; - - p->Buffer.Write += Readed; - - if (Readed >= Needed) - break; - - Needed -= Readed; - } - - return ERR_NONE; -} - -NOINLINE err_t ParserFillLine(parser* p) -{ - err_t Err; - do - { - const uint8_t* i; - for (i=p->Buffer.Read;i!=p->Buffer.Write;++i) - if (*i == '\n') - return ERR_NONE; - - Err = ParserFill(p,1); - - } while (Err==ERR_NONE); - return Err; -} - -void ParserBOM(parser* p) -{ - //TODO: use BOM detection in more places (playlist,xml,...) - //TODO: support 16bit LE/BE encodings - const uint8_t* BOM = ParserPeek(p,3); - if (BOM) - { - if (BOM[0]==0xEF && BOM[1]==0xBB && BOM[2]==0xBF) - { - intptr_t Skip = 3; - ParserSkip(p,&Skip); - if (p->Context) - ParserCC(p,p->Context->FromUTF8,0); - } - } -} - -NOINLINE void ParserCC(parser* p, charconv* CC, bool_t OwnCC) -{ - if (p->CC && p->OwnCC) - CharConvClose(p->CC); - p->CC = CC; - p->OwnCC = (boolmem_t)OwnCC; -} - -err_t ParserStream(parser* p, stream* Stream, parsercontext* Context) -{ - ParserCC(p,Context ? Context->FromStr:NULL, 0); - - p->Stream = Stream; - p->Element = 0; - p->ElementEof = 0; - p->Error = 0; - p->URL = 0; - p->Context = Context; - - if (Stream) - { - if (!p->Buffer.Begin) - if (!BufferAlloc(&p->Buffer,4096,1)) - return ERR_OUT_OF_MEMORY; - } - else { - BufferClear(&p->Buffer); - if (p->BigLine) { - free(p->BigLine); - p->BigLine = NULL; - } - } - return ERR_NONE; -} - -err_t ParserSkip(parser* p, intptr_t* Skip) -{ - intptr_t n = min(*Skip,p->Buffer.Write - p->Buffer.Read); - if (n>0) - { - *Skip -= n; - p->Buffer.Read += n; - } - return Stream_Skip(p->Stream,Skip); -} - -err_t ParserReadEx(parser* p, void* Data, size_t Size, size_t* Readed, bool_t Fill) -{ - if (!Fill) - { - size_t n = 0; - if (p->Buffer.Write > p->Buffer.Read) - { - n = min(Size,(size_t)(p->Buffer.Write-p->Buffer.Read)); - memcpy(Data,p->Buffer.Read,n); - p->Buffer.Read += n; - Size -= n; - } - if (Readed) - *Readed = n; - return !Size ? ERR_NONE:ERR_NEED_MORE_DATA; - } - return ParserRead(p,Data,Size,Readed); -} - -err_t ParserRead(parser* p, void* Data, size_t Size, size_t* Readed) -{ - if (p->Buffer.Write > p->Buffer.Read) - { - err_t Err = ERR_NONE; - size_t n = min(Size,(size_t)(p->Buffer.Write-p->Buffer.Read)); - memcpy(Data,p->Buffer.Read,n); - p->Buffer.Read += n; - Size -= n; - if (Size>0) - { - Err = Stream_Read(p->Stream,(uint8_t*)Data+n,Size,&Size); - n += Size; - } - if (Readed) - *Readed = n; - return Err; - } - - return Stream_Read(p->Stream,Data,Size,Readed); -} - -const uint8_t* ParserPeek(parser* p, size_t Len) -{ - if (p->Buffer.Write < p->Buffer.Read+Len) - { - ParserFill(p,p->Buffer.Read+Len-p->Buffer.Write); - if (p->Buffer.Write < p->Buffer.Read+Len) - return NULL; - } - return p->Buffer.Read; -} - -const uint8_t* ParserPeekEx(parser* p, size_t Len, bool_t Fill, err_t* Err) -{ - if (p->Buffer.Write < p->Buffer.Read+Len) - { - if (!Fill) - { - *Err = ERR_NEED_MORE_DATA; - return NULL; - } - *Err = ParserFill(p,p->Buffer.Read+Len-p->Buffer.Write); - if (p->Buffer.Write < p->Buffer.Read+Len) - return NULL; - } - *Err = ERR_NONE; - return p->Buffer.Read; -} - -#define PARSER_BEGIN(p) \ - uint8_t* Read = p->Buffer.Read; \ - uint8_t* Write = p->Buffer.Write; \ - -#define PARSER_RESTART(p) \ - Read = p->Buffer.Read; \ - Write = p->Buffer.Write; \ - -#define PARSER_SAVE(p) \ - p->Buffer.Read = Read; - -#define PARSER_FILL(p) \ - PARSER_SAVE(p) \ - ParserFill(p,1); \ - PARSER_RESTART(p) - -static bool_t SkipAfter(parser* p, int ch) -{ - PARSER_BEGIN(p) - for (;;++Read) - { - if (Read>=Write) - { - PARSER_FILL(p) - if (Read>=Write) - return 0; - } - - if (*Read==(uint8_t)ch) - break; - } - ++Read; - PARSER_SAVE(p); - return 1; -} - -bool_t ParserIsToken(parser* p, const tchar_t* Token) -{ - PARSER_BEGIN(p) - // space skipping - for (;;++Read) - { - if (Read>=Write) - { - PARSER_FILL(p) - if (Read>=Write) - return 0; - } - if (*Read!=' ' && *Read!=9 && *Read!=10 && *Read!=13) - break; - } - PARSER_SAVE(p) - for (;*Token;++Read,++Token) - { - if (Read>=Write) - { - PARSER_FILL(p) - if (Read>=Write) - return 0; - } - if (*Read!=(uint8_t)*Token) - return 0; - } - - PARSER_SAVE(p) - return 1; -} - -NOINLINE bool_t ParserIsFormat(parser* p,const tchar_t* Token, void *Value) -{ - size_t i,j=0; - tchar_t tBuffer[MAXDATA]; - - PARSER_BEGIN(p) - if (!*Token || *Token!='%') - return 0; - - // space skipping - for (;;++Read) - { - if (Read>=Write) - { - PARSER_FILL(p) - if (Read>=Write) - return 0; - } - if (*Read!=' ' && *Read!=9 && *Read!=10 && *Read!=13) - break; - } - PARSER_SAVE(p) - - for (;j=Write) - { - PARSER_FILL(p) - if (Read>=Write) - return 0; - } - tBuffer[j] = (tchar_t)p->Buffer.Read[j]; - i=++j; - if (!stscanf_s(tBuffer,&i,Token,Value)) - break; - if (i != j) - break; - } - if (j>1) // recover the last working config - { - --j; - stscanf_s(tBuffer,&j,Token,Value); - } - - PARSER_SAVE(p) - return (j!=0); -} - -static bool_t IsToken(parser* p, const tchar_t* Token) -{ - PARSER_BEGIN(p) - for (;*Token;++Read,++Token) - { - if (Read>=Write) - { - PARSER_FILL(p) - if (Read>=Write) - return 0; - } - if (*Read!=(uint8_t)*Token) - return 0; - } - PARSER_SAVE(p) - return 1; -} - -typedef struct htmlchar -{ - uint8_t ch; - tchar_t sym[6+1]; - -} htmlchar; - -static const htmlchar HTMLChar[] = -{ - {34,T("quot")}, - {38,T("amp")}, - {39,T("apos")}, - {60,T("lt")}, - {62,T("gt")}, - {160,T("nbsp")}, - {161,T("iexcl")}, - {162,T("cent")}, - {163,T("pound")}, - {164,T("curren")}, - {165,T("yen")}, - {166,T("brvbar")}, - {167,T("sect")}, - {168,T("uml")}, - {169,T("copy")}, - {170,T("ordf")}, - {171,T("laquo")}, - {172,T("not")}, - {173,T("shy")}, - {174,T("reg")}, - {175,T("hibar")}, - {176,T("deg")}, - {177,T("plusmn")}, - {185,T("sup1")}, - {178,T("sup2")}, - {179,T("sup3")}, - {180,T("acute")}, - {181,T("micro")}, - {182,T("para")}, - {183,T("middot")}, - {184,T("cedil")}, - {186,T("ordm")}, - {187,T("raquo")}, - {188,T("frac14")}, - {189,T("frac12")}, - {190,T("frac34")}, - {191,T("iquest")}, - {192,T("Agrave")}, - {193,T("Aacute")}, - {194,T("Acirc")}, - {195,T("Atilde")}, - {196,T("Auml")}, - {197,T("Aring")}, - {198,T("AElig")}, - {199,T("Ccedil")}, - {200,T("Egrave")}, - {201,T("Eacute")}, - {202,T("Ecirc")}, - {203,T("Euml")}, - {204,T("Igrave")}, - {205,T("Iacute")}, - {206,T("Icirc")}, - {207,T("Iuml")}, - {208,T("ETH")}, - {209,T("Ntilde")}, - {210,T("Ograve")}, - {211,T("Oacute")}, - {212,T("Ocirc")}, - {213,T("Otilde")}, - {214,T("Ouml")}, - {215,T("times")}, - {216,T("Oslash")}, - {217,T("Ugrave")}, - {218,T("Uacute")}, - {219,T("Ucirc")}, - {220,T("Uuml")}, - {221,T("Yacute")}, - {222,T("THORN")}, - {223,T("szlig")}, - {224,T("agrave")}, - {225,T("aacute")}, - {226,T("acirc")}, - {227,T("atilde")}, - {228,T("auml")}, - {229,T("aring")}, - {230,T("aelig")}, - {231,T("ccedil")}, - {232,T("egrave")}, - {233,T("eacute")}, - {234,T("ecirc")}, - {235,T("euml")}, - {236,T("igrave")}, - {237,T("iacute")}, - {238,T("icirc")}, - {239,T("iuml")}, - {240,T("eth")}, - {241,T("ntilde")}, - {242,T("ograve")}, - {243,T("oacute")}, - {244,T("ocirc")}, - {245,T("otilde")}, - {246,T("ouml")}, - {247,T("divide")}, - {248,T("oslash")}, - {249,T("ugrave")}, - {250,T("uacute")}, - {251,T("ucirc")}, - {252,T("uuml")}, - {253,T("yacute")}, - {254,T("thorn")}, - {255,T("yuml")}, - {0,T("")} -}; - -void ParserHTMLChars(parser *p, tchar_t *Out, size_t OutLen) -{ - const tchar_t* i; - utf16_t ch; - utf16_t UChar[2]; - UChar[1] = 0; - for (;*Out;++Out,--OutLen) - { - if (*Out==T('&') && (i=tcschr(Out,T(';')))!=NULL) - { - ch = 0; - if (Out[1]=='#') - { - if (IsDigit(Out[2])) // decimal encoding - { - const tchar_t* s; - for (s = Out+2;sch;++c) - if (tcsnicmp(c->sym,Out+1,n)==0 && c->sym[n]==0) - { - ch = c->ch; - break; - } - } - - if (ch) - { - size_t Index=0; - UChar[0] = ch; - Node_FromUTF16(p->Context,Out,OutLen,UChar); - for (Index=0;Index0;++URL,--OutLen) - if (URL[0]=='%' && Hex(URL[1])>=0 && Hex(URL[2])>=0) - { - *URL = (tchar_t)((Hex(URL[1])<<4)+Hex(URL[2])); - memmove(URL+1,URL+3,sizeof(tchar_t)*(tcslen(URL+3)+1)); - } -} - -void ParserURLToHTML(tchar_t* p,size_t n) -{ - for (;*p && n>0;++p,--n) - if (*p == ' ' && n>=4) - { - size_t i = min(n-4,tcslen(p+1)); - memmove(p+3,p+1,i*sizeof(tchar_t)); - p[3+i] = 0; - - p[0] = '%'; - p[1] = '2'; - p[2] = '0'; - } -} - -void ParserSkipAfter(parser* p, int Delimiter) -{ - tchar_t Del[2]; - ParserReadUntil(p,NULL,0,Delimiter); - Del[0] = (tchar_t)Delimiter; - Del[1] = 0; - IsToken(p,Del); -} - -intptr_t ParserReadUntil(parser* p, tchar_t* Out, size_t OutLen, int Delimiter) -{ - char* s = alloca(OutLen); - size_t n=0; - - PARSER_BEGIN(p) - if (Delimiter == '>' || Delimiter == '=') - { - // ' ','\t','\n','/','>' as additional delimiters - for (;;++Read) - { - if (Read>=Write) - { - PARSER_FILL(p) - if (Read>=Write) - { - if (!n) return -1; - break; - } - } - - if (*Read<0x40) // fast prefilter - { - if (*Read==(uint8_t)Delimiter || *Read==' ' || *Read=='\t' || *Read=='\n' || *Read=='/' || *Read=='>') - break; - } - - if (*Read!='\r' && ++n=Write) - { - PARSER_FILL(p) - if (Read>=Write) - { - if (!n) return -1; - break; - } - } - - if (*Read==(uint8_t)Delimiter) - { - if (Delimiter == ']') - { - bool_t Found; - PARSER_SAVE(p); - Found = ParserIsToken(p,T("]]>")); - PARSER_RESTART(p); - if (Found) - break; - } - else - { - if (Delimiter != '<') // skip delimiter (except for '<') - ++Read; - break; - } - } - - if (*Read!='\r' && ++n0) - { - if (!n) - *Out = 0; - else - { - s[min(n,OutLen-1)]=0; - CharConvTS(p->CC,Out,OutLen,s); - - if (Delimiter != '\n') // not ParserLine - ParserHTMLChars(p,Out,OutLen); - - if (p->URL) - ParserHTMLToURL(Out,OutLen); - } - } - return n; -} - -bool_t ParserLine(parser* p, tchar_t* Out, size_t OutLen) -{ - return ParserReadUntil(p,Out,OutLen,'\n')>=0; -} - -bool_t ParserBigLine(parser* p) -{ - if (!p->BigLine) { - p->BigLine = (tchar_t *) malloc(BIGLINE * sizeof(tchar_t)); - if (!p->BigLine) - return 0; - } - return ParserLine(p, p->BigLine, BIGLINE); -} - -NOINLINE void ParserElementSkip(parser* p) -{ - while (ParserIsAttrib(p,NULL,0)) - ParserAttribSkip(p); -} - -NOINLINE void ParserElementSkipNested(parser* p) -{ - ParserElementSkip(p); - while (ParserIsElementNested(p,NULL,0)) - ParserElementSkipNested(p); -} - -static NOINLINE bool_t ElementStart(parser* p) -{ - for (;;) - { - if (!SkipAfter(p,'<')) - break; - - if (IsToken(p,T("!--"))) - { - do - { - if (!SkipAfter(p,'-')) - return 0; - } - while (!IsToken(p,T("->"))); - } - else if (IsToken(p,T("![CDATA["))) - { - do - { - if (!SkipAfter(p,']')) - return 0; - } - while (!IsToken(p,T("]>"))); - } - else return 1; - } - return 0; -} - -bool_t ParserIsElementNested(parser* p, tchar_t* Name, size_t NameLen) -{ - bool_t Start = 1; - - if (p->Element) - ParserElementSkipNested(p); - - if (p->ElementEof || !(Start = ElementStart(p)) || IsToken(p,T("/"))) - { - if (!Start) - p->Error = 1; - p->ElementEof = 0; - p->Element = 0; - } - else - p->Element = (boolmem_t)(ParserReadUntil(p,Name,NameLen,'>')>0); - - return p->Element; -} - -bool_t ParserIsElement(parser* p, tchar_t* Name, size_t NameLen) -{ - ParserElementSkip(p); - - if (!ElementStart(p)) - { - p->Element = 0; - } - else - { - if (IsToken(p,T("/")) && NameLen>0) - { - *(Name++) = '/'; - --NameLen; - } - - p->Element = (boolmem_t)(ParserReadUntil(p,Name,NameLen,'>')>0); - } - - return p->Element; -} - -bool_t ParserElementContent(parser* p, tchar_t* Out, size_t OutLen) -{ - ParserElementSkip(p); - if (ParserReadUntil(p,Out,OutLen,'<')<0) - return 0; - if (ParserIsToken(p,T("![CDATA["))) - return ParserReadUntil(p,Out,OutLen,']')>=0; - return 1; -} - -bool_t ParserIsAttrib(parser* p, tchar_t* Name, size_t NameLen) -{ - if (!p->Element) - return 0; - - // skip spaces by ParserIsToken - p->ElementEof = (boolmem_t)ParserIsToken(p,T("/>")); - if (p->ElementEof || IsToken(p,T(">")) || IsToken(p,T("?>"))) - p->Element = 0; - else - p->Element = (boolmem_t)(ParserReadUntil(p,Name,NameLen,'=')>0); - return p->Element; -} - -bool_t ParserAttribLangStr(parser* p, parsercontext* Context, fourcc_t Class, dataid Id) -{ - tchar_t Value[MAXDATA/sizeof(tchar_t)+64]; - if (!ParserAttribString(p,Value,TSIZEOF(Value))) - return 0; - StrTab_Add(&Context->StrTab,1,Class,(int32_t)Id,Value); - return 1; -} - -bool_t ParserAttribString(parser* p, tchar_t* Out, size_t OutLen) -{ - int Delimiter; - - // skip spaces by ParserIsToken - if (!ParserIsToken(p,T("="))) - return 0; - - // skip spaces by ParserIsToken - if (ParserIsToken(p,T("\""))) - Delimiter = '\"'; - else if (IsToken(p,T("'"))) - Delimiter = '\''; - else - Delimiter = '>'; - - return ParserReadUntil(p,Out,OutLen,Delimiter)>=0; -} - -void ParserAttribSkip(parser* p) -{ - ParserAttribString(p,NULL,0); -} - -bool_t ParserIsRootElement(parser *p, tchar_t* Root, size_t RootLen) -{ - tchar_t Token[MAXTOKEN]; - - while (ParserIsElement(p,Token,TSIZEOF(Token))) - { - if (tcsisame_ascii(Token,T("?xml"))) - { - while (ParserIsAttrib(p,Token,TSIZEOF(Token))) - { - if (tcsisame_ascii(Token,T("encoding"))) - { - ParserAttribString(p,Token,TSIZEOF(Token)); - ParserCC(p,CharConvOpen(Token,NULL),1); - } - else - ParserAttribSkip(p); - } - } - else - if (tcsisame_ascii(Token,T("!DOCTYPE")) || Token[0]==T('?')) - { - ParserElementSkip(p); - } - else - { - tcscpy_s(Root,RootLen,Token); - return 1; - } - } - return 0; -} - -err_t ParserStreamXML(parser* p, stream* s, parsercontext* Context, const tchar_t* Root, bool_t NeedRootAttribs) -{ - err_t Result=ERR_NONE; - tchar_t FoundRoot[MAXPATH]; - - if (!Root || !Root[0]) - return ERR_INVALID_PARAM; - Result = ParserStream(p,s,Context); - if (Result==ERR_NONE) - { - if (Context) - ParserCC(p,Context->FromUTF8, 0); - if (!ParserIsRootElement(p, FoundRoot, TSIZEOF(FoundRoot))) - { - Result = ERR_INVALID_DATA; - } - else - { - if (tcsisame_ascii(FoundRoot,Root) && !NeedRootAttribs) - ParserElementSkip(p); - } - } - return Result; -} - -static NOINLINE bool_t IsName(int ch) -{ - return ch== '_' || IsAlpha(ch) || IsDigit(ch); -} - -typedef struct findpin -{ - fourcc_t ClassId; - datadef* DataDef; - node* Node; - const tchar_t* Expr; - -} findpin; - -static bool_t FindParam(node* Base, findpin* Find, nodecontext*); - -static INLINE bool_t FindChild(nodetree* i, const tchar_t* Token, findpin* Find) -{ - nodetree* Child = NodeTree_FindChild(i,Token); - if (Child && FindParam((node*)Child,Find,Node_Context(Child))) - return 1; - return 0; -} - -static NOINLINE bool_t ReadName(findpin* Find, tchar_t* Token, size_t TokenLen) -{ - size_t i=0; - while (IsName((Find->Expr)[0])) - { - if (i+1Expr)[0]; - ++(Find->Expr); - } - Token[i] = 0; - - if ((Find->Expr)[0] == '.') - { - ++(Find->Expr); - return 1; - } - - return 0; -} - -static NOINLINE bool_t FindParam(node* Base, findpin* Find, nodecontext* Context) -{ - const tchar_t* Expr0 = Find->Expr; - tchar_t Token[MAXTOKEN]; - - if (!ReadName(Find,Token,TSIZEOF(Token))) - { - if (Token[0]) - { - // check for param - if (Base && Find->DataDef && NodeFindDef(Base,Token,Find->DataDef)) - { - Find->Node = Base; - return 1; - } - } - else - { - // check for default param - if (Base && Find->DataDef && NodeDataDef(Base,NODE_DEFAULT_DATA,Find->DataDef)) - { - Find->Node = Base; - return 1; - } - - // check for classid - if (Base && Node_IsPartOf(Base,Find->ClassId)) - { - Find->Node = Base; - return 1; - } - Find->Expr = Expr0; - return 0; - } - } - - if (!Base) - { - // try singleton - Base = NodeSingleton(Context,StringToFourCC(Token,1)); - if (Base && FindParam(Base,Find,Context)) - return 1; - } - else - if (Node_IsPartOf(Base,NODETREE_CLASS)) - { - if (tcsisame_ascii(Token,T("parent"))) - { - // go parent - Base = (node*)((nodetree*)Base)->Parent; - if (Base && FindParam(Base,Find,Context)) - return 1; - } - else - if (FindChild((nodetree*)Base,Token,Find)) - return 1; - } - - Find->Expr = Expr0; - return 0; -} - -static NOINLINE bool_t FindPin(node* Base, findpin* Find, nodecontext* Context) -{ - // Base == NULL, when only singletons are accepted - while (Base) - { - if (FindParam(Base,Find,Context)) - return 1; - - if (Node_IsPartOf(Base,NODETREE_CLASS)) - Base = (node*)((nodetree*)Base)->Parent; - else - Base = NULL; - } - - // try singleton - return FindParam(NULL,Find,Context); -} - -bool_t StringToPin(pin* Data, datadef* DataDef, exprstate* State, const tchar_t** Expr) -{ - findpin Find; - Find.ClassId = 0; - Find.DataDef = DataDef; - Find.Expr = *Expr; - Find.Node = NULL; - - if (!ARRAYEMPTY(State->NodeLookup)) - { - tchar_t Id[MAXTOKEN]; - tchar_t Token[MAXTOKEN]; - node* Node; - - Id[0]=0; - while (ReadName(&Find,Token,TSIZEOF(Token))) - tcscpy_s(Id,TSIZEOF(Id),Token); - - Node = NodeLookup_FindUnique(&State->NodeLookup,Id); - if (Node) - { - if (NodeFindDef(Node,Token,DataDef)) - { - Data->Id = DataDef->Id; - Data->Node = Node; - *Expr = Find.Expr; - return 1; - } - else - if (Node_IsPartOf(Node,NODETREE_CLASS) && FindChild((nodetree*)Node,Token,&Find)) - { - Data->Id = DataDef->Id; - Data->Node = Find.Node; - *Expr = Find.Expr; - return 1; - } - else - { - Data->Id = 0; - Data->Node = NULL; - return 0; - } - } - - Find.Expr = *Expr; - } - - if (!FindPin(State->Base,&Find,State->Context)) - { - if (State->Context && ARRAYEMPTY(State->NodeLookup)) - { - bool_t Result; - NodeLookup_AddSingletons(&State->NodeLookup,State->Context); - Result = StringToPin(Data,DataDef,State,Expr); - ArrayClear(&State->NodeLookup); - return Result; - } - else - { - Data->Id = 0; - Data->Node = NULL; - return 0; - } - } - - Data->Id = DataDef->Id; - Data->Node = Find.Node; - *Expr = Find.Expr; - return 1; -} - -bool_t StringToNode(node** Data, exprstate* State, const tchar_t** Expr) -{ - findpin Find; - Find.ClassId = State->ClassId?State->ClassId:NODE_CLASS; - Find.DataDef = NULL; - Find.Expr = *Expr; - Find.Node = NULL; - - if (!ARRAYEMPTY(State->NodeLookup)) - { - tchar_t Id[MAXTOKEN]; - node* Node; - - while (ReadName(&Find,Id,TSIZEOF(Id))) {} - - Node = NodeLookup_FindUnique(&State->NodeLookup,Id); - if (Node) - { - if (Node_IsPartOf(Node,Find.ClassId)) - { - *Data = Node; - *Expr = Find.Expr; - return 1; - } - else - { - *Data = NULL; - return 0; - } - } - - Find.Expr = *Expr; - } - - - if (!FindPin(State->Base,&Find,State->Context)) - { - *Data = NULL; - return 0; - } - - *Data = Find.Node; - *Expr = Find.Expr; - return 1; -} - -bool_t PinToString(tchar_t* Value, size_t ValueLen, const pin* Data, node* Base) -{ - if (NodeToString(Value,ValueLen,Data->Node,Base) && Data->Node) - { - size_t n; - if (Value[0]) - tcscat_s(Value,ValueLen,T(".")); - n = tcslen(Value); - NodeParamName(Data->Node,Data->Id,Value+n,ValueLen-n); - } - - return 1; -} - -bool_t NodeToString(tchar_t* Value, size_t ValueLen, node* Node, node* UNUSED_PARAM(Base)) -{ - Value[0]=0; - - if (Node) - { - if (NodeClassFlags(Node) & CFLAG_SINGLETON) - FourCCToString(Value,ValueLen,Node_ClassId(Node)); - else - { - //TODO: use Base... (maybe NULL) - if (Node_Get(Node,NODE_ID,Value,ValueLen*sizeof(tchar_t))!=ERR_NONE) - Value[0] = 0; - } - } - - return 1; -} - -static NOINLINE int StringToIntEx(const tchar_t* Value, dataflags Flags, exprstate* State) -{ - int v; - if (State && State->EnumList) - { - v = StrListIndex(Value,State->EnumList); - if (v>=0) - return v; - } - - v = StringToInt(Value,-1); - - if (State) - { - switch (Flags & TUNIT_MASK) - { - case TUNIT_XCOORD: - if (State->CoordScale.x) - v = (v*State->CoordScale.x+(1<<15)) >> 16; - break; - - case TUNIT_YCOORD: - if (State->CoordScale.y) - v = (v*State->CoordScale.y+(1<<15)) >> 16; - break; - } - } - - return v; -} - -NOINLINE bool_t ExprToData(void* Data, size_t* Size, dataflags Flags, exprstate* State, const tchar_t** Expr) -{ - cc_point v; - - switch (Flags & TYPE_MASK) - { - case TYPE_POINT: - if (State && ExprIsPoint(Expr,&v) && *Size>=sizeof(cc_point)) - { - *(cc_point*)Data = v; - *Size = sizeof(cc_point); - return 1; - } - break; - case TYPE_POINT16: - if (State && ExprIsPoint(Expr,&v) && *Size>=sizeof(cc_point16)) - { - if ((Flags & TUNIT_MASK)==TUNIT_COORD) - { - if (State->CoordScale.x) - v.x = (v.x*State->CoordScale.x+(1<<15)) >> 16; - if (State->CoordScale.y) - v.y = (v.y*State->CoordScale.y+(1<<15)) >> 16; - } - - ((cc_point16*)Data)->x = (int16_t)v.x; - ((cc_point16*)Data)->y = (int16_t)v.y; - *Size = sizeof(cc_point16); - return 1; - } - break; - } - - return 0; -} - -NOINLINE bool_t StringToData(void* Data, size_t Size, dataflags Flags, exprstate* State, const tchar_t* Value) -{ - datadef DataDef; - cc_fraction f; - size_t i; - int a,b; - - switch (Flags & TYPE_MASK) - { - case TYPE_STRING: - tcscpy_s(Data,Size/sizeof(tchar_t),Value); - break; - - case TYPE_BINARY: - for (i=0;i=0 && (b=Hex(Value[i*2+1]))>=0;++i) - ((uint8_t*)Data)[i] = (uint8_t)(a*16+b); - break; - - case TYPE_RGB: - *(rgbval_t*)Data = StringToRGB(Value); - break; - - case TYPE_TICK: - *(tick_t*)Data = StringToTick(Value); - break; - - case TYPE_SIZE: - *(size_t*)Data = StringToIntEx(Value,Flags,State); - break; - - case TYPE_INT: - if ((Flags & TUNIT_MASK)==TUNIT_PERCENT) - { - StringToFraction(Value,&f,1); - *(int*)Data = ScaleRound(PERCENT_ONE,f.Num,f.Den); - } - else - if ((Flags & TUNIT_MASK)==TUNIT_HOTKEY) - *(int*)Data = StringToHotKey(Value); - else - *(int*)Data = StringToIntEx(Value,Flags,State); - break; - - case TYPE_INT8: - *(uint8_t*)Data = (uint8_t)StringToIntEx(Value,Flags,State); - break; - - case TYPE_INT16: - *(uint16_t*)Data = (uint16_t)StringToIntEx(Value,Flags,State); - break; - - case TYPE_GUID: - StringToGUID(Value,(cc_guid*)Data); - break; - - case TYPE_DBNO: //TODO: support for 64 bits - case TYPE_DATETIME: - case TYPE_INT32: - *(int32_t*)Data = (int32_t)StringToIntEx(Value,Flags,State); - break; - - case TYPE_INT64: - *(int64_t*)Data = StringToInt64(Value); - break; - - case TYPE_BOOL_BIT: - case TYPE_BOOLEAN: - *(bool_t*)Data = StringToInt(Value,-1); - break; - - case TYPE_FOURCC: - *(fourcc_t*)Data = StringToFourCC(Value,(Flags & TUNIT_MASK)==TUNIT_UPPER); - break; - - case TYPE_FIX16: - StringToFraction(Value,&f,0); - *(int*)Data = Scale32(FIX16_UNIT,f.Num,f.Den); - break; - - case TYPE_FRACTION: - ((cc_fraction*)Data)->Num = 0; - ((cc_fraction*)Data)->Den = 0; - if (tcschr(Value,':')) - { - stscanf(Value,T("%d:%d"),&a,&b); - ((cc_fraction*)Data)->Num = a; - ((cc_fraction*)Data)->Den = b; - } - else - StringToFraction(Value,(cc_fraction*)Data,(Flags & TUNIT_MASK)==TUNIT_PERCENT); - break; - - case TYPE_NODE: - if (!State) - return 0; - return StringToNode((node**)Data,State,&Value); - - case TYPE_PIN: - if (!State) - return 0; - return StringToPin((pin*)Data,&DataDef,State,&Value); - - case TYPE_POINT: - case TYPE_POINT16: - return ExprToData(Data,&Size,Flags,State,&Value); +} - default: - return 0; - } - return 1; +void Node_FromUTF8(anynode* p, tchar_t* Out,size_t OutLen, const char* In) +{ + CharConvTS(Parser_Context(p)->FromUTF8,Out,OutLen,In); } -NOINLINE bool_t ParserAttrib(parser* p, void* Data, size_t Size, dataflags Flags, exprstate* State) +void Node_ToStr(anynode* p, char* Out,size_t OutLen, const tchar_t* In) { - tchar_t Value[MAXDATA+64]; - if (!ParserAttribString(p,Value,TSIZEOF(Value))) - return 0; + CharConvST(Parser_Context(p)->ToStr,Out,OutLen,In); +} - return StringToData(Data,Size,Flags,State,Value); +void Node_FromStr(anynode* p, tchar_t* Out,size_t OutLen, const char* In) +{ + CharConvTS(Parser_Context(p)->FromStr,Out,OutLen,In); } -void ExprState(exprstate* State, node* Node, dataid Id, dataflags Flags) +void Node_ToWcs(anynode* p, wchar_t* Out,size_t OutLen, const tchar_t* In) { - if (Flags & TFLAG_ENUM) - State->EnumList = (const tchar_t*)Node_Meta(Node,Id,META_PARAM_ENUMNAME); - else - State->EnumList = NULL; + CharConvWT(Parser_Context(p)->ToWcs,Out,OutLen,In); +} - if ((Flags & TYPE_MASK) == TYPE_NODE) - State->ClassId = (fourcc_t)Node_Meta(Node,Id,META_PARAM_CLASS); +void Node_FromWcs(anynode* p, tchar_t* Out,size_t OutLen, const wchar_t* In) +{ + CharConvTW(Parser_Context(p)->FromWcs,Out,OutLen,In); } -bool_t ParserValueData(const tchar_t* Value, node* Node, const datadef* DataDef, exprstate* State, parserexpradd ExprAdd, bool_t ExprSave) +void Node_ToUTF16(anynode* p, utf16_t* Out,size_t OutLen, const tchar_t* In) { - uint8_t Data[MAXDATA]; - size_t Size = Node_MaxDataSize(Node,DataDef->Id,DataDef->Flags,META_PARAM_SET); - datatype Type = DataDef->Flags & TYPE_MASK; + CharConvUT(Parser_Context(p)->ToUtf16,Out,OutLen,In); +} - State->Context = Node_Context(Node); - ExprState(State,Node,DataDef->Id,DataDef->Flags); +void Node_FromUTF16(anynode* p, tchar_t* Out,size_t OutLen, const utf16_t* In) +{ + CharConvTU(Parser_Context(p)->FromUtf16,Out,OutLen,In); +} - if (Type == TYPE_ARRAY) - { - bool_t Result; - array Array; - const tchar_t* Expr = Value; - dataflags Flags = (dataflags)Node_Meta(Node,DataDef->Id,META_PARAM_ARRAY_TYPE); - ArrayInit(&Array); +static NOINLINE bool_t IsName(int ch) +{ + return ch== '_' || IsAlpha(ch) || IsDigit(ch); +} - for (;;) - { - Size = sizeof(Data); +typedef struct findpin +{ + fourcc_t ClassId; + datadef* DataDef; + node* Node; + const tchar_t* Expr; - if (!ExprToData(Data,&Size,Flags,State,&Expr)) - break; +} findpin; - if (!ArrayAppend(&Array,Data,Size,0)) - break; +static bool_t FindParam(node* Base, findpin* Find, nodecontext*); - ExprIsSymbol(&Expr,','); - } +static INLINE bool_t FindChild(nodetree* i, const tchar_t* Token, findpin* Find) +{ + nodetree* Child = NodeTree_FindChild(i,Token); + if (Child && FindParam((node*)Child,Find,Node_Context(Child))) + return 1; + return 0; +} - Result = Node_SET(Node,DataDef->Id,&Array) == ERR_NONE; +static NOINLINE bool_t ReadName(findpin* Find, tchar_t* Token, size_t TokenLen) +{ + size_t i=0; + while (IsName((Find->Expr)[0])) + { + if (i+1Expr)[0]; + ++(Find->Expr); + } + Token[i] = 0; - ArrayClear(&Array); - return Result; + if ((Find->Expr)[0] == '.') + { + ++(Find->Expr); + return 1; } - if (ExprAdd && - !State->EnumList && - (Type == TYPE_INT || - Type == TYPE_STRING || - Type == TYPE_FRACTION || - Type == TYPE_FIX16 || - Type == TYPE_RGB || - Type == TYPE_BOOLEAN || - Type == TYPE_BOOL_BIT || - Type == TYPE_FOURCC || - Type == TYPE_DBNO || - Type == TYPE_TICK || - Type == TYPE_SIZE || - Type == TYPE_PIN || - Type == TYPE_EXPR)) + return 0; +} + +static NOINLINE bool_t FindParam(node* Base, findpin* Find, nodecontext* Context) +{ + const tchar_t* Expr0 = Find->Expr; + tchar_t Token[MAXTOKEN]; + + if (!ReadName(Find,Token,TSIZEOF(Token))) { - // try to detect constants to skip expression evaluation... - const tchar_t* s = Value; - if (Type != TYPE_STRING && Type != TYPE_EXPR && Type != TYPE_FOURCC) + if (Token[0]) { - if (*s=='-' || *s=='+') ++s; - for (;*s;++s) - if (IsAlpha(*s) || tcschr(T("+-<>()=*/!%"),*s)!=NULL) - break; + // check for param + if (Base && Find->DataDef && NodeFindDef(Base,Token,Find->DataDef)) + { + Find->Node = Base; + return 1; + } } + else + { + // check for default param + if (Base && Find->DataDef && NodeDataDef(Base,NODE_DEFAULT_DATA,Find->DataDef)) + { + Find->Node = Base; + return 1; + } - if (*s) - return ExprAdd(Node,DataDef,State,Value,ExprSave) == ERR_NONE; + // check for classid + if (Base && Node_IsPartOf(Base,Find->ClassId)) + { + Find->Node = Base; + return 1; + } + Find->Expr = Expr0; + return 0; + } } - if (!StringToData(Data,sizeof(Data),DataDef->Flags,State,Value)) + if (!Base) + { + // try singleton + Base = NodeSingleton(Context,StringToFourCC(Token,1)); + if (Base && FindParam(Base,Find,Context)) + return 1; + } + else + if (Node_IsPartOf(Base,NODETREE_CLASS)) { - // try reference resolving - if (Type == TYPE_NODE && ExprAdd) - return ExprAdd(Node,DataDef,State,Value,ExprSave) == ERR_NONE; + if (tcsisame_ascii(Token,T("parent"))) + { + // go parent + Base = (node*)((nodetree*)Base)->Parent; + if (Base && FindParam(Base,Find,Context)) + return 1; + } + else + if (FindChild((nodetree*)Base,Token,Find)) + return 1; + } + + Find->Expr = Expr0; + return 0; +} - // save for later - return ExprAdd && ExprSave && ExprAdd(Node,DataDef,NULL,Value,1) == ERR_NONE; +static bool_t PinToString(tchar_t* Value, size_t ValueLen, const pin* Data, node* Base) +{ + if (NodeToString(Value,ValueLen,Data->Node,Base) && Data->Node) + { + size_t n; + if (Value[0]) + tcscat_s(Value,ValueLen,T(".")); + n = tcslen(Value); + NodeParamName(Data->Node,Data->Id,Value+n,ValueLen-n); } - return Node_Set(Node,DataDef->Id,Data,Size) == ERR_NONE; + return 1; } -bool_t ParserAttribData(parser* p, node* Node, const datadef* DataDef, exprstate* State, parserexpradd ExprAdd, bool_t ExprSave) +bool_t NodeToString(tchar_t* Value, size_t ValueLen, node* Node, node* UNUSED_PARAM(Base)) { - tchar_t Value[MAXDATA+64]; + Value[0]=0; - if (!ParserAttribString(p,Value,TSIZEOF(Value))) - return 0; + if (Node) + { + if (NodeClassFlags(Node) & CFLAG_SINGLETON) + FourCCToString(Value,ValueLen,Node_ClassId(Node)); + else + { + //TODO: use Base... (maybe NULL) + if (Node_Get(Node,NODE_ID,Value,ValueLen*sizeof(tchar_t))!=ERR_NONE) + Value[0] = 0; + } + } - return ParserValueData(Value,Node,DataDef,State,ExprAdd,ExprSave); + return 1; } err_t TextPrintf(textwriter* p, const tchar_t* Msg,...) @@ -1632,9 +392,6 @@ NOINLINE bool_t DataToString(tchar_t* Value, size_t ValueLen, const void* Data, FractionToString(Value,ValueLen,&f,-1,1); } else - if ((Type & TUNIT_MASK)==TUNIT_HOTKEY) - HotKeyToString(Value,ValueLen,*(int*)Data,NULL,NULL); - else if (Display && (Type & TUNIT_MASK)==TUNIT_BYTERATE) ByteRateToString(Value,ValueLen,*(int*)Data); else @@ -1885,167 +642,6 @@ NOINLINE void ExprTrimSpace(tchar_t** p) } } -NOINLINE bool_t ExprCmd(const tchar_t** Expr, tchar_t* Out, size_t OutLen) -{ - const tchar_t* s; - bool_t Quote=0; - - ExprSkipSpace(Expr); - - s = *Expr; - if (*s == '\0') - return 0; - - assert(*s && (Quote || !IsSpace(*s))); - - for (;*s && (Quote || !IsSpace(*s));++s) - { - if (*s == '"') - { - Quote = !Quote; - continue; - } - - if (OutLen>1) - { - *(Out++) = *s; - --OutLen; - } - } - - *Expr = s; - - if (OutLen>0) - *Out=0; - - return 1; -} - -static NOINLINE bool_t ReadHex(const tchar_t** p,intptr_t* Out,bool_t RGB, bool_t Neg); - -NOINLINE bool_t ExprIsTokenEx(const tchar_t** p,const tchar_t* Name,...) -{ - const tchar_t* s = *p; - bool_t Long = 0; - va_list Arg; - va_start(Arg, Name); - - if (!*Name) - return 0; - - ExprSkipSpace(&s); - - while (*Name && *s) - { - if (*Name == ' ') - { - ExprSkipSpace(&s); - ++Name; - } - else - if (*Name == '%') - { - int IntSize = 0; - ++Name; - if (IsDigit(*Name)) - { - IntSize = *Name - '0'; - ++Name; - } - while (*Name == 'l') - { - Long=1; - ++Name; // long - } - if (*Name=='I' && *(Name+1)=='6' && *(Name+2)=='4') - { - Long=1; - Name += 3; - } - if (*Name == 'd') - { - if (Long) - { - if ((!IntSize && !ExprIsInt64(&s,va_arg(Arg,int64_t*)))||(IntSize && !ExprIsInt64Ex(&s,IntSize,va_arg(Arg,int64_t*)))) - break; - } - else - { - if ((!IntSize && !ExprIsInt(&s,va_arg(Arg,intptr_t*)))||(IntSize && !ExprIsIntEx(&s,IntSize,va_arg(Arg,intptr_t*)))) - break; - } - ++Name; - } - if (*Name == 'x') - { - if (!ReadHex(&s,va_arg(Arg,intptr_t*),0,0)) - break; - ++Name; - } - else if (*Name == 's') - { - tchar_t *Out = va_arg(Arg,tchar_t*); - size_t OutLen = va_arg(Arg,size_t); - ++Name; - while (OutLen>1 && *s && (*s != *Name && (*Name || *s != ' '))) - { - *Out++ = *s++; - OutLen--; - } - *Out = 0; - } - else if (*Name == '%') - { - if (*s == '%') { - ++s; - ++Name; - } - } - } - else - { - size_t n; - for (n=1;Name[n] && Name[n]!=' ' && Name[n]!='%';++n) {} - - if (tcsnicmp_ascii(s,Name,n)!=0) - break; - - Name += n; - s += n; - } - } - - va_end(Arg); - - if (*Name==0 && (!IsAlpha(Name[-1]) || !IsAlpha(*s))) - { - *p = s; - return 1; - } - return 0; -} - -NOINLINE bool_t ExprIsToken(const tchar_t** p,const tchar_t* Name) -{ - return ExprIsTokenEx(p,Name); -} - -uint32_t StringToIP(const tchar_t *Address) -{ - uint32_t Result = 0; - tchar_t *s; - while ((s = tcschr(Address,T('.')))!=NULL) - { - *s++ = 0; - Result <<= 8; - Result |= StringToInt(Address,0); - Address = s; - } - Result <<= 8; - Result |= StringToInt(Address,0); - return Result; -} - static const uint8_t Base64[] = { 0x3e,0x80,0x80,0x80,0x3f,0x34,0x35,0x36,0x37,0x38,0x39,0x3a,0x3b,0x3c,0x3d,0x80, @@ -2409,18 +1005,6 @@ NOINLINE bool_t ExprIsFrac(const tchar_t** p,cc_fraction* Out) return 1; } -bool_t ExprIsPoint(const tchar_t** p, cc_point* Out) -{ - intptr_t x,y; - if (ExprIsTokenEx(p,T("{ %ld , %ld }"),&x,&y)) - { - Out->x = (int)x; - Out->y = (int)y; - return 1; - } - return 0; -} - #define MAX_GCD_ITER 128 void SimplifyFrac(cc_fraction* f, int64_t Num, int64_t Den) @@ -2524,7 +1108,6 @@ void TextSerializeNode(textwriter* Text, node* p, uint_fast32_t Mask, uint_fast3 tchar_t Name[32]; uint8_t Data[MAXDATA]; size_t Size = Node_MaxDataSize(p,i->Id,i->Flags,META_PARAM_GET); - assert((i->Id & ~DATA_ENUM)==i->Id); assert(Size <= sizeof(Data)); if (Size) { @@ -2550,47 +1133,11 @@ void TextSerializeNode(textwriter* Text, node* p, uint_fast32_t Mask, uint_fast3 ArrayClear(&List); } -void ParserImport(parser* Parser,node* Node) -{ - tchar_t Token[MAXTOKEN]; - exprstate State; - memset(&State,0,sizeof(State)); - - while (ParserIsAttrib(Parser,Token,MAXTOKEN)) - { - datadef DataDef; - if (NodeFindDef(Node,Token,&DataDef)) - ParserAttribData(Parser,Node,&DataDef,&State,NULL,0); - else - ParserAttribSkip(Parser); - } -} - -void ParserImportNested(parser* Parser,node* Node) -{ - if (Node) - ParserImport(Parser,Node); - - if (Node && Node_IsPartOf(Node,NODETREE_CLASS)) - { - tchar_t Token[MAXTOKEN]; - while (ParserIsElementNested(Parser,Token,MAXTOKEN)) - { - node* Child = NodeCreate(Node,StringToFourCC(Token,0)); - ParserImportNested(Parser,Child); - if (Child) - NodeTree_SetParent(Child,Node,NULL); - } - } - else - ParserElementSkipNested(Parser); -} - #define LANG_STRINGS_OFFSET 0x100 static err_t GetStr(node* p,dataid Id, tchar_t *Data, size_t Size) { - if (Id-LANG_STRINGS_OFFSET < DATA_ENUM) + if (Id-LANG_STRINGS_OFFSET < DATA_ICON) tcscpy_s(Data,Size/sizeof(tchar_t),StrTab_GetPos(&Parser_Context(p)->StrTab,Id-LANG_STRINGS_OFFSET)); else if ((Id-LANG_STRINGS_OFFSET) & DATA_DYNNAME) StrTab_GetPosName(&Parser_Context(p)->StrTab,(Id-LANG_STRINGS_OFFSET) & ~DATA_DYNNAME, Data, Size/sizeof(tchar_t)); diff --git a/corec/corec/helpers/parser/strtab.c b/corec/corec/helpers/parser/strtab.c index 7e47e888..32d8e802 100644 --- a/corec/corec/helpers/parser/strtab.c +++ b/corec/corec/helpers/parser/strtab.c @@ -27,7 +27,10 @@ * ****************************************************************************/ -#include "parser.h" +#include "parser.h" // struct strtab +#include "strtab.h" +#include +#include #define TABLEALIGN 1024 @@ -46,7 +49,7 @@ void StrTab_Init(strtab* p, const cc_memheap* Heap, size_t Alloc) ArrayAlloc(&p->Table,Alloc,TABLEALIGN); } -NOINLINE void StrTab_Clear(strtab* p) +static NOINLINE void StrTab_Clear(strtab* p) { stringdef **i; for (i=ARRAYBEGIN(p->Table,stringdef*);i!=ARRAYEND(p->Table,stringdef*);++i) @@ -72,63 +75,6 @@ static int CmpDef(const void* UNUSED_PARAM(p), const void* vpa, const void* vpb) return 0; } -void StrTab_Add(strtab* p, bool_t Secondary, fourcc_t Class, int32_t Id, const tchar_t* s) -{ - size_t Pos; - bool_t Found; - - stringdef Def; - stringdef* Ptr = &Def; - Def.Class = Class; - Def.Id = Id; - - if (s && !*s) - s = NULL; - - // already the same? - Pos = ArrayFind(&p->Table,stringdef*,&Ptr,CmpDef,NULL,&Found); - - if (Found) - { - Ptr = ARRAYBEGIN(p->Table,stringdef*)[Pos]; - - if (Secondary || (s && tcscmp(s,(tchar_t*)(Ptr+1))==0)) - s = NULL; // keep old - else - { - MemHeap_Free(p->Heap,Ptr,sizeof(stringdef)+tcsbytes((tchar_t*)(Ptr+1))); - ArrayDelete(&p->Table,Pos*sizeof(stringdef*),sizeof(stringdef*)); - } - } - - if (s) - { - size_t Size = tcsbytes(s); - Ptr = MemHeap_Alloc(p->Heap,sizeof(stringdef)+Size,0); - if (Ptr) - { - MemHeap_Write(p->Heap,Ptr,&Def,0,sizeof(stringdef)); - MemHeap_Write(p->Heap,Ptr,s,sizeof(stringdef),Size); - ArrayAdd(&p->Table,stringdef*,&Ptr,CmpDef,NULL,TABLEALIGN); - } - } -} - -int StrTab_Enum(strtab* p, fourcc_t Class, size_t Count) -{ - int Result = -1; - stringdef **i; - - for (i=ARRAYBEGIN(p->Table,stringdef*);i!=ARRAYEND(p->Table,stringdef*);++i) - if ((*i)->Class==Class && Count--==0) - { - Result = (*i)->Id; - break; - } - - return Result; -} - static NOINLINE size_t FindPos(strtab *p, fourcc_t Class, int Id) { size_t Pos; @@ -165,14 +111,6 @@ const tchar_t* StrTab_Find(strtab* p, fourcc_t Class, int Id) return GetPos(p,FindPos(p,Class,Id)); } -bool_t StrTab_Get(strtab* p, fourcc_t Class, int Id, tchar_t* Out, size_t OutLen) -{ - size_t Pos; - Pos = FindPos(p,Class,Id); - tcscpy_s(Out,OutLen,GetPos(p,Pos)); - return (Pos!=STRTAB_INVALID_POS); -} - void StrTab_GetPosName(strtab *p, size_t Pos, tchar_t *Out, size_t OutLen) { *Out = 0; diff --git a/corec/corec/helpers/parser/strtab.h b/corec/corec/helpers/parser/strtab.h index dd9469cc..a4fda1f0 100644 --- a/corec/corec/helpers/parser/strtab.h +++ b/corec/corec/helpers/parser/strtab.h @@ -30,23 +30,13 @@ #ifndef __STRTAB_H #define __STRTAB_H -typedef struct strtab -{ - const cc_memheap* Heap; - array Table; - -} strtab; #define STRTAB_INVALID_POS ((size_t)-1) #define STRTAB_ITEMSIZE 8 void StrTab_Init(strtab*, const cc_memheap* Heap, size_t Alloc); void StrTab_Done(strtab*); -void StrTab_Clear(strtab*); -void StrTab_Add(strtab*, bool_t Secondary, fourcc_t Class, int32_t Id, const tchar_t* s); -NODE_DLL int StrTab_Enum(strtab*, fourcc_t Class, size_t No); const tchar_t* StrTab_Find(strtab*, fourcc_t Class, int Id); -bool_t StrTab_Get(strtab*, fourcc_t Class, int Id, tchar_t* Out, size_t OutLen); size_t StrTab_Pos(strtab*, fourcc_t Class, int Id); const tchar_t* StrTab_GetPos(strtab*, size_t Pos); void StrTab_GetPosName(strtab *, size_t Pos, tchar_t *Out, size_t OutLen); diff --git a/corec/corec/helpers/parser/strtypes.c b/corec/corec/helpers/parser/strtypes.c index 6f5d7bde..0263fff1 100644 --- a/corec/corec/helpers/parser/strtypes.c +++ b/corec/corec/helpers/parser/strtypes.c @@ -27,7 +27,10 @@ * ****************************************************************************/ +#include "strtypes.h" #include "parser.h" +#include +#include fourcc_t StringToFourCC(const tchar_t* In, bool_t Upper) { @@ -57,28 +60,10 @@ void GUIDToString(tchar_t* Out, size_t OutLen, const cc_guid* p) p->v4[4],p->v4[5],p->v4[6],p->v4[7]); } -bool_t StringToGUID(const tchar_t* In, cc_guid* p) -{ - int i,v[10]; - if (In[0]=='{') ++In; - if (stscanf(In,T("%08x-%04x-%04x-%02x%02x-%02x%02x%02x%02x%02x%02x"), - &p->v1,v+0,v+1,v+2,v+3,v+4,v+5,v+6,v+7,v+8,v+9) < 11) - { - memset(p,0,sizeof(cc_guid)); - return 0; - } - p->v2 = (uint16_t)v[0]; - p->v3 = (uint16_t)v[1]; - for (i=0;i<8;++i) - p->v4[i] = (uint8_t)v[2+i]; - return 1; -} - // gcc 2.97 bug... static const tchar_t mask_d[] = T("%d"); static const tchar_t mask_dd[] = T("%d%d"); static const tchar_t mask_X[] = T("%X"); -static const tchar_t mask_02X[] = T("%02X"); static const tchar_t mask_0x08X[] = T("0x%08X"); static const tchar_t mask_0x08Xx08X[] = T("0x%08X%08X"); static const tchar_t mask_rgb[] = T("#%08X"); @@ -132,18 +117,6 @@ void FractionToString(tchar_t* Out, size_t OutLen, const cc_fraction* p, int Per tcscat_s(Out,OutLen,T("%")); } -void StringToFraction(const tchar_t* In, cc_fraction* Out, bool_t Percent) -{ - ExprSkipSpace(&In); - if (!ExprIsFrac(&In,Out)) - { - Out->Num=0; - Out->Den=0; - } - if (Percent) - Out->Den *= 100; -} - int StringToInt(const tchar_t* In, int Hex) { int v=0; @@ -184,126 +157,6 @@ void RGBToString(tchar_t* Out, size_t OutLen, rgbval_t RGB) Out[7] = 0; } -rgbval_t StringToRGB(const tchar_t* In) -{ - int v; - if (*In=='#') ++In; - v = StringToInt(In,1); - if (tcslen(In)<=6) - v <<= 8; - return INT32BE(v); -} - -tick_t StringToTick(const tchar_t* In) -{ - // hour:min:sec.msec - - bool_t Sign = 0; - tick_t Tick = 0; - int Hour,Min,Sec; - int n; - - if (*In=='-') - { - Sign = 1; - ++In; - } - else - if (*In=='+') - ++In; - - n = stscanf(In,T("%d:%d:%d"),&Hour,&Min,&Sec); - if (n>0) - { - Tick = Hour; - if (n>1) - { - Tick *= 60; - Tick += Min; - if (n>2) - { - Tick *= 60; - Tick += Sec; - } - } - Tick *= TICKSPERSEC; - } - - In = tcschr(In,T('.')); - if (In) - { - int64_t Num = 0; - int64_t Den = 1; - ++In; - for (;IsDigit(*In);++In) - { - Num = Num*10 + (*In-'0'); - Den *= 10; - } - Tick += (tick_t)((Num*TICKSPERSEC+Den/2)/Den); - } - - if (Sign) - Tick = -Tick; - - return Tick; -} - -systick_t StringToSysTick(const tchar_t* In) -{ - // hour:min:sec.msec - - bool_t Sign = 0; - systick_t Tick = 0; - int Hour,Min,Sec; - int n; - - if (*In=='-') - { - Sign = 1; - ++In; - } - else - if (*In=='+') - ++In; - - n = stscanf(In,T("%d:%d:%d"),&Hour,&Min,&Sec); - if (n>0) - { - Tick = Hour; - if (n>1) - { - Tick *= 60; - Tick += Min; - if (n>2) - { - Tick *= 60; - Tick += Sec; - } - } - Tick *= GetTimeFreq(); - } - - In = tcschr(In,T('.')); - if (In) - { - int64_t Num = 0; - int64_t Den = 1; - ++In; - for (;IsDigit(*In);++In) - { - Num = Num*10 + (*In-'0'); - Den *= 10; - } - Tick += (systick_t)((Num*GetTimeFreq()+Den/2)/Den); - } - - if (Sign) - Tick = -Tick; - - return Tick; -} - void TickToString(tchar_t* Out, size_t OutLen, tick_t Tick, bool_t MS, bool_t Extended, bool_t Fix) { tchar_t Sign[2] = {0}; @@ -380,70 +233,6 @@ void SysTickToString(tchar_t* Out, size_t OutLen, systick_t Tick, bool_t MS, boo } } -void URLToString(tchar_t* Title, size_t TitleLen, const tchar_t* URL) -{ - const tchar_t *i; - tchar_t *j; - assert(TitleLen>0); - // replace %20 and '_' with space - for (j=Title,i=URL;*i && TitleLen>1;++i,--TitleLen) - { - if (*i=='_') - *j++ = ' '; - else - if (i[0]=='%' && Hex(i[1])>=0 && Hex(i[2])>=0) - { - *j++ = (tchar_t)((Hex(i[1])<<4) + Hex(i[2])); - i += 2; - } - else - *j++ = *i; - } - *j=0; -} - -static bool_t IsUrlSafe(tchar_t i) -{ - return (i == T('$') || i == T('-') || i == T('_') || i == T('.') || i == T('+')); -} - -void StringToURL(anynode* AnyNode, tchar_t* Out, size_t OutLen, const tchar_t *URL) -{ - size_t Utf8Len = max(2*tcslen(URL),OutLen); // try to estimate - char *Utf8 = malloc(Utf8Len); - assert(OutLen>0); - if (Utf8) - { - const char *i; - Node_ToUTF8(AnyNode,Utf8,Utf8Len,URL); - for (i=Utf8;*i && OutLen>1;++i) - { - if (IsDigit(*i) || IsAlpha(*i) || IsUrlSafe(*i)) - { - OutLen--; - *Out++ = *i; - } - else - if (OutLen>3) - { - OutLen--; - *Out++ = T('%'); - stprintf_s(Out,OutLen,mask_02X,*i & 0xFF); - OutLen -= tcslen(Out); - Out += tcslen(Out); - } - } - free(Utf8); - } - *Out = 0; -} - -void LangToIso639_1(tchar_t *Out, size_t OutLen, fourcc_t Lang) -{ - FourCCToString(Out,OutLen,Lang); - tcslwr(Out); -} - void ByteRateToString(tchar_t* Out, size_t OutLen, int ByteRate) { int KB = Scale32(ByteRate,8,1000); @@ -461,277 +250,3 @@ void ByteRateToString(tchar_t* Out, size_t OutLen, int ByteRate) tcscat_s(Out,OutLen,T(" kbit/s")); } } - -datetime_t RFC822ToRel(const tchar_t *Date) -{ - datetime_t Result; - datepack_t ResultPacked = {0}; - intptr_t Offset=0; - const tchar_t *s = tcschr(Date,T(',')); - const tchar_t* const Token[12] = { T("Jan"), T("Feb"), T("Mar"), T("Apr"), T("May"), - T("Jun"), T("Jul"), T("Aug"), T("Sep"), T("Oct"), T("Nov"), T("Dec") }; - const tchar_t* const TokenLong[12] = { T("January"), T("February"), T("March"), T("April"), T("May"), - T("June"), T("July"), T("August"), T("September"), T("October"), T("November"), T("December") }; - - if (s) - s++; - else - s = Date; - ExprSkipSpace(&s); - if (!ExprIsTokenEx(&s,T("%ld "),&ResultPacked.Day)) - return INVALID_DATETIME_T; - - ExprSkipSpace(&s); - for (ResultPacked.Month=0;ResultPacked.Month<12;++ResultPacked.Month) - if (ExprIsToken(&s,Token[ResultPacked.Month])) - break; - if (ResultPacked.Month==12) - for (ResultPacked.Month=0;ResultPacked.Month<12;++ResultPacked.Month) - if (ExprIsToken(&s,TokenLong[ResultPacked.Month])) - break; - if (ResultPacked.Month==12) - return INVALID_DATETIME_T; - ResultPacked.Month++; - - ExprSkipSpace(&s); - if (!ExprIsTokenEx(&s,T("%ld %ld:%ld:%ld"),&ResultPacked.Year,&ResultPacked.Hour,&ResultPacked.Minute,&ResultPacked.Second) - && !ExprIsTokenEx(&s,T("%ld %ld:%ld"),&ResultPacked.Year,&ResultPacked.Hour,&ResultPacked.Minute)) - return INVALID_DATETIME_T; - if (ResultPacked.Year < 100) - ResultPacked.Year += 2000; - - ExprSkipSpace(&s); - if (ExprIsTokenEx(&s,T("+%d"),&Offset)) - Offset = -Offset; - else if (ExprIsTokenEx(&s,T("-%d"),&Offset)) - {} - else if (ExprIsToken(&s,T("EDT"))) - Offset = 400; - else if (ExprIsToken(&s,T("EST"))) - Offset = 500; - else if (ExprIsToken(&s,T("CST"))) - Offset = 600; - else if (ExprIsToken(&s,T("CDT"))) - Offset = 500; - else if (ExprIsToken(&s,T("MST"))) - Offset = 600; - else if (ExprIsToken(&s,T("MDT"))) - Offset = 500; - else if (ExprIsToken(&s,T("PST"))) - Offset = 600; - else if (ExprIsToken(&s,T("PDT"))) - Offset = 500; - - - Result = TimePackToRel(&ResultPacked,0); - - if (Result != INVALID_DATETIME_T) - Result += (datetime_t)(((Offset/100)*60)+(Offset%100))*60; - - return Result; -} - -datetime_t ISO8601ToRel(const tchar_t *InDate) -{ - tchar_t Time[32],Date[32]; - datetime_t Result; - datepack_t ResultPacked = {0}; - intptr_t Offset=0; - const tchar_t *s; - tchar_t *t; - - s = InDate; - ExprSkipSpace(&s); - tcscpy_s(Date,TSIZEOF(Date),s); - s = Date; - - // split the time and date parts - Time[0] = 0; - t = tcsrchr(s,T('T')); - if (!t) - t = tcsrchr(s,T(' ')); - if (t) - { - tcscpy_s(Time,TSIZEOF(Time),t+1); - t[0] = 0; - } - - if (!*Time) - { - t = tcsrchr(s,T('Z')); - if (t && t[1] == 0) - { - // assume HHMMSS for the time - if (tcslen(Date)>=13) - { - tcscpy_s(Time,TSIZEOF(Time),max(t-6,s)); - Time[6] = 0; - t[-6]=0; - } - } - } - - if (!ExprIsTokenEx(&s,T("%ld-%ld-%ld"),&ResultPacked.Year,&ResultPacked.Month,&ResultPacked.Day) && - !ExprIsTokenEx(&s,T("%ld:%ld:%ld"),&ResultPacked.Year,&ResultPacked.Month,&ResultPacked.Day) && - !ExprIsTokenEx(&s,T("%4ld%2ld%2ld"),&ResultPacked.Year,&ResultPacked.Month,&ResultPacked.Day) && - !ExprIsTokenEx(&s,T("%2ld%2ld%2ld"),&ResultPacked.Year,&ResultPacked.Month,&ResultPacked.Day)) - return INVALID_DATETIME_T; - - if (ResultPacked.Year < 50) - ResultPacked.Year += 2000; - else if (ResultPacked.Year < 100) - ResultPacked.Year += 1900; - - if (*Time) - { - s = Time; - if (ExprIsTokenEx(&s,T("%ld:%ld:%ld"),&ResultPacked.Hour,&ResultPacked.Minute,&ResultPacked.Second) || - ExprIsTokenEx(&s,T("%2ld%2ld%2ld"),&ResultPacked.Hour,&ResultPacked.Minute,&ResultPacked.Second)) - { - intptr_t MilliSeconds; - ExprIsTokenEx(&s,T(".%d"),&MilliSeconds); - if (s[0]) - { - const tchar_t *o=s + 1; - intptr_t OffsetH,OffsetM=0; - if (ExprIsTokenEx(&o,T("%ld:%ld"),&OffsetH,&OffsetM) || - ExprIsTokenEx(&o,T("%2ld%2ld"),&OffsetH,&OffsetM) || - ExprIsTokenEx(&o,T("%2ld"),&OffsetH)) - { - Offset = (OffsetH*60 + OffsetM)*60; - } - if (s[0] == T('+')) - Offset = -Offset; - } - } - } - - Result = TimePackToRel(&ResultPacked,0); - - if (Result != INVALID_DATETIME_T) - Result += (datetime_t)Offset; - - return Result; -} - -#define BUFLEN 30 - -static void ZPad(tchar_t* Out, size_t Len, intptr_t v) -{ - Out[Len] = '\0'; - while (Len--) { - Out[Len] = (tchar_t) ('0' + v % 10); - v = v / 10; - } -} - -size_t StrFTime(tchar_t* Out, size_t OutLen, const tchar_t *Format, datepack_t *dp) -{ - const tchar_t* const Month[12] = { T("Jan"), T("Feb"), T("Mar"), T("Apr"), T("May"), - T("Jun"), T("Jul"), T("Aug"), T("Sep"), T("Oct"), T("Nov"), T("Dec") }; - const tchar_t* const MonthLong[12] = { T("January"), T("February"), T("March"), T("April"), T("May"), - T("June"), T("July"), T("August"), T("September"), T("October"), T("November"), T("December") }; - const tchar_t* const WeekDay[7] = { T("Sun"), T("Mon"), T("Tue"), T("Wed"), T("Thu"), T("Fri"), T("Sat") }; - const tchar_t* const WeekDayLong[7] = { T("Sunday"), T("Monday"), T("Tuesday"), T("Wednesday"), T("Thursday"), - T("Friday"), T("Saturday") }; - const tchar_t* const AMPM[2] = { T("am"), T("pm") }; - const tchar_t* const DateTimeFormat[3] = { T("%y/%m/%d"), T("%H:%M:%S"), T("%a %b %d %H:%M:%S %Y") }; - - tchar_t buf[BUFLEN]; - tchar_t *p, *q; - const tchar_t *r; - - p = Out; - q = Out + OutLen - 1; - while ((*Format != '\0')) - { - if (*Format++ == '%') - { - r = buf; - switch (*Format++) - { - case '%' : - buf[0] = '%'; - buf[1] = '\0'; - break; - case 'a' : - r = WeekDay[dp->WeekDay-1]; - break; - case 'A' : - r = WeekDayLong[dp->WeekDay-1]; - break; - case 'b' : - r = Month[dp->Month-1]; - break; - case 'B' : - r = MonthLong[dp->Month-1]; - break; - case 'c' : - StrFTime(buf, BUFLEN, DateTimeFormat[2], dp); - break; - case 'd' : - ZPad(buf, 2, dp->Day); - break; - case 'H' : - ZPad(buf, 2, dp->Hour); - break; - case 'I' : - ZPad(buf, 2, dp->Hour==12 ? 12 : dp->Hour%12); - break; - case 'm' : - ZPad(buf, 2, dp->Month); - break; - case 'M' : - ZPad(buf, 2, dp->Minute); - break; - case 'p' : - r = AMPM[dp->Hour/12]; - break; - case 'S' : - ZPad(buf, 2, dp->Second); - break; - case 'w' : - ZPad(buf, 1, dp->WeekDay-1); - break; - case 'x' : - StrFTime(buf, BUFLEN, DateTimeFormat[0], dp); - break; - case 'X' : - StrFTime(buf, BUFLEN, DateTimeFormat[1], dp); - break; - case 'y' : - ZPad(buf, 2, dp->Year % 100); - break; - case 'Y' : - ZPad(buf, 4, dp->Year); - break; - default: - buf[0] = '%'; - buf[1] = Format[-1]; - buf[2] = '\0'; - if (buf[1] == 0) - Format--; - } - while (*r) - { - if (p == q) - { - *q = '\0'; - return 0; - } - *p++ = *r++; - } - } - else - { - if (p == q) - { - *q = '\0'; - return 0; - } - *p++ = Format[-1]; - } - } - *p = '\0'; - return p - Out; -} diff --git a/corec/corec/helpers/parser/strtypes.h b/corec/corec/helpers/parser/strtypes.h index 364e97e8..07b77278 100644 --- a/corec/corec/helpers/parser/strtypes.h +++ b/corec/corec/helpers/parser/strtypes.h @@ -1,5 +1,5 @@ /***************************************************************************** - * + * * Copyright (c) 2008-2010, CoreCodec, Inc. * All rights reserved. * @@ -30,27 +30,18 @@ #ifndef __STRTYPES_H #define __STRTYPES_H -NODE_DLL fourcc_t StringToFourCC(const tchar_t* In, bool_t Upper); -NODE_DLL void FractionToString(tchar_t* Out, size_t OutLen, const cc_fraction* Fraction, int Percent, int Decimal); -NODE_DLL void StringToFraction(const tchar_t* In, cc_fraction* Out, bool_t Percent); +#include // NODE_DLL + +fourcc_t StringToFourCC(const tchar_t* In, bool_t Upper); +void FractionToString(tchar_t* Out, size_t OutLen, const cc_fraction* Fraction, int Percent, int Decimal); NODE_DLL int StringToInt(const tchar_t* In, int Hex); NODE_DLL int64_t StringToInt64(const tchar_t* In); -NODE_DLL void IntToString(tchar_t* Out, size_t OutLen, int32_t Int, bool_t Hex); -NODE_DLL void Int64ToString(tchar_t* Out, size_t OutLen, int64_t Int, bool_t Hex); -NODE_DLL void TickToString(tchar_t* Out, size_t OutLen, tick_t Tick, bool_t MS, bool_t Extended, bool_t Fix); +void IntToString(tchar_t* Out, size_t OutLen, int32_t Int, bool_t Hex); +void Int64ToString(tchar_t* Out, size_t OutLen, int64_t Int, bool_t Hex); +void TickToString(tchar_t* Out, size_t OutLen, tick_t Tick, bool_t MS, bool_t Extended, bool_t Fix); NODE_DLL void SysTickToString(tchar_t* Out, size_t OutLen, systick_t Tick, bool_t MS, bool_t Extended, bool_t Fix); -NODE_DLL tick_t StringToTick(const tchar_t* In); -NODE_DLL systick_t StringToSysTick(const tchar_t* In); -NODE_DLL void RGBToString(tchar_t* Out, size_t OutLen, rgbval_t RGB); -NODE_DLL rgbval_t StringToRGB(const tchar_t* In); -NODE_DLL void GUIDToString(tchar_t* Out, size_t OutLen, const cc_guid*); -NODE_DLL bool_t StringToGUID(const tchar_t* In, cc_guid*); -NODE_DLL void StringToURL(anynode* AnyNode, tchar_t* Out, size_t OutLen, const tchar_t *URL); -NODE_DLL void URLToString(tchar_t* Out, size_t OutLen, const tchar_t *URL); -NODE_DLL void LangToIso639_1(tchar_t *Out, size_t OutLen, fourcc_t Lang); -NODE_DLL void ByteRateToString(tchar_t* Out, size_t OutLen, int ByteRate); -NODE_DLL datetime_t RFC822ToRel(const tchar_t *); -NODE_DLL datetime_t ISO8601ToRel(const tchar_t *); -NODE_DLL size_t StrFTime(tchar_t* Out, size_t OutLen, const tchar_t *Format, datepack_t *dp); +void RGBToString(tchar_t* Out, size_t OutLen, rgbval_t RGB); +void GUIDToString(tchar_t* Out, size_t OutLen, const cc_guid*); +void ByteRateToString(tchar_t* Out, size_t OutLen, int ByteRate); #endif diff --git a/corec/corec/helpers/parser/urlpart.c b/corec/corec/helpers/parser/urlpart.c deleted file mode 100644 index b0ad3b44..00000000 --- a/corec/corec/helpers/parser/urlpart.c +++ /dev/null @@ -1,257 +0,0 @@ -/***************************************************************************** - * - * Copyright (c) 2008-2010, CoreCodec, Inc. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * * Neither the name of CoreCodec, Inc. nor the - * names of its contributors may be used to endorse or promote products - * derived from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY CoreCodec, Inc. ``AS IS'' AND ANY - * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL CoreCodec, Inc. BE LIABLE FOR ANY - * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - ****************************************************************************/ - -#include "parser.h" - -#define URLPART_ID FOURCC('U','P','A','T') -#define URLPART_URL 0x100 -#define URLPART_MIME 0x101 - -#define URLPART_SEPARATOR T("$") -#define URLPART_SEP_CHAR T('$') -#define URLPART_SEP_ESCAPE T("$$") - -typedef struct urlpart -{ - stream Base; - stream *Input; - filepos_t Pos; - size_t Length; - bool_t Blocking; - -} urlpart; - -err_t CreateUrlPart(nodecontext *Context, tchar_t *Out, size_t OutLen, const tchar_t *URL, filepos_t Offset, size_t Length, const tchar_t *Mime) -{ - datetime_t FileDate; - if (!URL || !URL[0]) - return ERR_INVALID_DATA; - - stprintf_s(Out,OutLen,T("urlpart://%s"),URL); - tcsreplace(Out,OutLen,URLPART_SEPARATOR,URLPART_SEP_ESCAPE); - tcscat_s(Out,OutLen,URLPART_SEPARATOR); - if (Offset > 0) - stcatprintf_s(Out,OutLen,T("ofs=%d#"),(int)Offset); // TODO: support 64 bits offset - if (Length > 0) - stcatprintf_s(Out,OutLen,T("len=%d#"),(int)Length); - if (Mime) - stcatprintf_s(Out,OutLen,T("mime=%s#"),Mime); - FileDate = FileDateTime(Context,URL); - if (FileDate != INVALID_DATETIME_T) - stcatprintf_s(Out,OutLen,T("date=%d#"),(int)FileDate); - return ERR_NONE; -} - -static void Clear(urlpart* p) -{ - Node_RemoveData((node*)p,STREAM_URL,TYPE_STRING); - Node_RemoveData((node*)p,URLPART_URL,TYPE_STRING); - Node_RemoveData((node*)p,URLPART_MIME,TYPE_STRING); - p->Length = (size_t)-1; - p->Pos = INVALID_FILEPOS_T; - p->Input = 0; -} - -static err_t Get(urlpart* p,dataid Id, void* Data, size_t Size) -{ - if (!p->Input) - return ERR_INVALID_DATA; - switch (Id) - { - case STREAM_LENGTH: (*(filepos_t*)Data)=p->Length; return ERR_NONE; - case STREAM_URL: return INHERITED(p,node_vmt,URLPART_ID)->Get(p,Id,Data,Size); - case STREAM_CONTENTTYPE: - { - tchar_t *Mime = Node_GetData((node*)p,URLPART_MIME,TYPE_STRING); - if (Mime) - { - tcscpy_s(Data,Size/sizeof(tchar_t),Mime); - return ERR_NONE; - } - } - } - return Node_Get(p->Input,Id,Data,Size); -} - -static err_t Set(urlpart* p,dataid Id, const void* Data, size_t Size) -{ - if (!p->Input) - return ERR_INVALID_DATA; - return Node_Set(p->Input,Id,Data,Size); -} - -static err_t Open(urlpart* p, const tchar_t* URL, int Flags) -{ - err_t Result; - const tchar_t *String, *Equal; - tchar_t Value[MAXPATHFULL]; - datetime_t Date = INVALID_DATETIME_T; - - String = tcsrchr(URL,URLPART_SEP_CHAR); - if (!String) - return ERR_INVALID_DATA; - - Clear(p); - Node_SetData((node*)p,STREAM_URL,TYPE_STRING,URL); - - Equal = GetProtocol(URL,NULL,0,NULL); - tcsncpy_s(Value,TSIZEOF(Value),Equal,String-Equal); - tcsreplace(Value,TSIZEOF(Value),URLPART_SEP_ESCAPE,URLPART_SEPARATOR); - Node_SetData((node*)p,URLPART_URL,TYPE_STRING,Value); - while (String++ && *String) - { - Equal = tcschr(String,T('=')); - if (Equal) - { - tchar_t *Sep = tcschr(Equal,T('#')); - if (Sep) - tcsncpy_s(Value,TSIZEOF(Value),Equal+1,Sep-Equal-1); - else - tcscpy_s(Value,TSIZEOF(Value),Equal+1); - - if (tcsncmp(String,T("ofs"),Equal-String)==0) - p->Pos = StringToInt(Value,0); - else if (tcsncmp(String,T("len"),Equal-String)==0) - p->Length = StringToInt(Value,0); - else if (tcsncmp(String,T("mime"),Equal-String)==0) - Node_SetData((node*)p,URLPART_MIME,TYPE_STRING,Value); - else if (tcsncmp(String,T("date"),Equal-String)==0) - Date = StringToInt(Value,0); - } - String = tcschr(String,'#'); - } - - if (Date!=INVALID_DATETIME_T && Date != FileDateTime(Node_Context(p),Node_GetDataStr((node*)p,URLPART_URL))) - return ERR_INVALID_DATA; - - p->Input = GetStream(p,Node_GetDataStr((node*)p,URLPART_URL),Flags); - if (!p->Input) - return ERR_NOT_SUPPORTED; - Stream_Blocking(p->Input,p->Blocking); - Result = Stream_Open(p->Input,Node_GetDataStr((node*)p,URLPART_URL),Flags); - if (Result == ERR_NONE && p->Pos!=INVALID_FILEPOS_T) // TODO: support asynchronous stream opening - { - if (Stream_Seek(p->Input,p->Pos,SEEK_SET)!=p->Pos) - return ERR_INVALID_DATA; - } - return Result; -} - -static filepos_t Seek(urlpart* p,filepos_t Pos,int SeekMode) -{ - if (!p->Input) - return INVALID_FILEPOS_T; - - switch (SeekMode) - { - case SEEK_SET: - Pos = min(Pos,(filepos_t)p->Length); - assert(p->Pos!=INVALID_FILEPOS_T); - return Stream_Seek(p->Input,Pos+p->Pos,SeekMode); - case SEEK_CUR: - return Stream_Seek(p->Input,Pos,SeekMode); - case SEEK_END: - Pos = max(Pos,-(filepos_t)p->Length); - assert(p->Pos!=INVALID_FILEPOS_T); - return Stream_Seek(p->Input,Pos+p->Pos+p->Length,SeekMode); - } - return INVALID_FILEPOS_T; -} - -static err_t Read(urlpart* p,void* Data,size_t Size,size_t* Readed) -{ - if (!p->Input) { - if (Readed) - *Readed=0; - return ERR_INVALID_DATA; - } - return Stream_Read(p->Input,Data,Size,Readed); -} - -static err_t ReadBlock(urlpart* p,block* Block,size_t Ofs,size_t Size,size_t* Readed) -{ - if (!p->Input) { - if (Readed) - *Readed=0; - return ERR_INVALID_DATA; - } - return Stream_ReadBlock(p->Input,Block,Ofs,Size,Readed); -} - -static err_t Blocking(urlpart* p,bool_t Blocking) -{ - p->Blocking = Blocking; - if (p->Input) - return Stream_Blocking(p->Input,Blocking); - return Blocking ? ERR_NONE : ERR_NOT_SUPPORTED; -} - -static err_t WaitStream(urlpart* p,bool_t Read, streamselect* Select) -{ - if (!p->Input) - return ERR_NOT_SUPPORTED; - return Stream_Wait(p->Input,Read,Select); -} - -static err_t SkipStream(urlpart* p,intptr_t* Skip) -{ - if (!p->Input) - return ERR_NOT_SUPPORTED; - return Stream_Skip(p->Input,Skip); -} - -static err_t Create(urlpart* p) -{ - p->Blocking = 1; - return ERR_NONE; -} - -static void Delete(urlpart* p) -{ - if (p->Input) - Node_Release(p->Input); - Clear(p); -} - -META_START(UrlPart_Class,URLPART_ID) -META_CLASS(SIZE,sizeof(urlpart)) -META_PARAM(STRING,NODE_PROTOCOL,T("urlpart")) -META_CLASS(CREATE,Create) -META_CLASS(DELETE,Delete) -META_VMT(TYPE_FUNC,node_vmt,Get,Get) -META_VMT(TYPE_FUNC,node_vmt,Set,Set) -META_VMT(TYPE_FUNC,stream_vmt,Blocking,Blocking) -META_VMT(TYPE_FUNC,stream_vmt,Open,Open) -META_VMT(TYPE_FUNC,stream_vmt,Seek,Seek) -META_VMT(TYPE_FUNC,stream_vmt,Read,Read) -META_VMT(TYPE_FUNC,stream_vmt,ReadBlock,ReadBlock) -META_VMT(TYPE_FUNC,stream_vmt,Wait,WaitStream) -META_VMT(TYPE_FUNC,stream_vmt,Skip,SkipStream) -META_DYNAMIC(TYPE_STRING,STREAM_URL) -META_END(STREAM_CLASS) diff --git a/corec/corec/helpers/parser/urlpart.h b/corec/corec/helpers/parser/urlpart.h deleted file mode 100644 index dee20501..00000000 --- a/corec/corec/helpers/parser/urlpart.h +++ /dev/null @@ -1,35 +0,0 @@ -/***************************************************************************** - * - * Copyright (c) 2008-2010, CoreCodec, Inc. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * * Neither the name of CoreCodec, Inc. nor the - * names of its contributors may be used to endorse or promote products - * derived from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY CoreCodec, Inc. ``AS IS'' AND ANY - * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL CoreCodec, Inc. BE LIABLE FOR ANY - * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - ****************************************************************************/ - -#ifndef __URLPART_H -#define __URLPART_H - -NODE_DLL err_t CreateUrlPart(nodecontext *Context, tchar_t *Out, size_t OutLen, const tchar_t *URL, filepos_t Offset, size_t Length, const tchar_t *Mime); - -#endif /* __URLPART_H */ diff --git a/corec/corec/node/corec.html b/corec/corec/node/corec.html index bb2ae1d0..7cba2ca7 100644 --- a/corec/corec/node/corec.html +++ b/corec/corec/node/corec.html @@ -193,10 +193,6 @@

The possible variable unit modifiers are:

Checklist - TUNIT_CHECKLIST
The boolean value should be shown as a checklist.
-
- Enumerate - TUNIT_ENUM -
The pin includes various possible values that can be read with the DATA_ENUM flag.
-
Enumerate - TUNIT_NUMBER
The integer should be displayed with no type.
@@ -241,10 +237,6 @@

The possible variable unit modifiers are:

Folder - TUNIT_FOLDER
The string value represents a path to a folder.
-
- Hotkey - TUNIT_HOTKEY -
The value is representing a hotkey.
-
AnyChar - TUNIT_ANYCHAR
The node value can have any char in the expression ???
diff --git a/corec/corec/node/node.c b/corec/corec/node/node.c index a497a0d3..7a7353b9 100644 --- a/corec/corec/node/node.c +++ b/corec/corec/node/node.c @@ -29,6 +29,8 @@ #include "node.h" #include "node_internal.h" +#include +#include #define NODE_MAGIC 0xF0DE0A6C #define DYNDATA_SHIFT 8 @@ -46,7 +48,7 @@ static const uint16_t ParamSize[MAX_PARAMTYPE] = sizeof(fourcc_t), //TYPE_FOURCC sizeof(filepos_t), //TYPE_FILEPOS sizeof(node*), //TYPE_NODE - sizeof(metanotify), //TYPE_META + 0, //TYPE_META sizeof(pin), //TYPE_PACKET sizeof(tick_t), //TYPE_TICK sizeof(nodenotify), //TYPE_NODENOTIFY @@ -72,9 +74,9 @@ static const uint16_t ParamSize[MAX_PARAMTYPE] = sizeof(int_fast32_t), //TYPE_DBNO sizeof(cc_guid), //TYPE_GUID sizeof(int), //TYPE_FIX16 - sizeof(int), //TYPE_LUA_REF + 0, //TYPE_LUA_REF sizeof(notifyex), //TYPE_NOTIFYEX - sizeof(dataenum), //TYPE_ENUM + 0, //TYPE_ENUM sizeof(multi_enum_set), //TYPE_ENUM_MULTI_SET sizeof(size_t), //TYPE_SIZE }; @@ -142,7 +144,6 @@ static const tchar_t* ParamFormat[(TUNIT_MASK>>TUNIT_SHIFT)+1] = T("password"), //TUNIT_PASSWORD T("upper"), //TUNIT_UPPER - T("hotkey"), //TUNIT_HOTKEY T("checklist"), //TUNIT_CHECKLIST T("percent"), //TUNIT_PERCENT T("hex"), //TUNIT_HEX @@ -491,11 +492,6 @@ static NOINLINE bool_t DataFree(nodecontext* p, node* Node, nodedata** i, bool_t else if (Type == TYPE_EXPR && p->ExprRelease) p->ExprRelease((nodeexpr*)NodeData_Data(Data)); -#if defined(CONFIG_CORELUA) - else - if (Type == TYPE_LUA_REF && p->LuaRelease) - p->LuaRelease(p->LuaCookie,(int*)NodeData_Data(Data)); -#endif else if (Type == TYPE_NODE_REF && *(node**)NodeData_Data(Data)) Node_Release(*(node**)NodeData_Data(Data)); @@ -567,11 +563,6 @@ NOINLINE void* Node_AddData(node* Node, dataid Id, datatype Type, const void* Da if (Type == TYPE_NODE_REF && *(node**)NodeData_Data(Ptr)) Node_AddRef(*(node**)NodeData_Data(Ptr)); -#if defined(CONFIG_CORELUA) - if (Type == TYPE_LUA_REF) - p->LuaAddRef(p->LuaCookie,(int*)NodeData_Data(Ptr)); -#endif - return NodeData_Data(Ptr); } } @@ -1940,6 +1931,15 @@ const tchar_t *NodeContext_UnitName(datatype Unit) return ParamFormat[Unit>>TUNIT_SHIFT]; } +static bool_t EqFrac(const cc_fraction* a, const cc_fraction* b) +{ + if (a->Den == b->Den && a->Num == b->Num) + return 1; + if (!a->Den) return b->Den==0; + if (!b->Den) return 0; + return (int64_t)b->Den * a->Num == (int64_t)a->Den * b->Num; +} + static const tchar_t NullString[] = T(""); static NOINLINE bool_t EqData(datatype Type, const void* a, const void* b, size_t Size) @@ -1982,19 +1982,6 @@ static NOINLINE bool_t EqData(datatype Type, const void* a, const void* b, size_ bool_t Node_EqData(node* p, dataid Id, dataflags Type, const void* a, const void* b) { - if ((Type & TFLAG_MULTI_ENUM) && (Id & DATA_ENUM_MULTI)) - { - // b is a dataenumex with all the set values - uint8_t *v; - int *IsSet; - const dataenum *Values = (const dataenum *)b; - for (v=ARRAYBEGIN(Values->Value,uint8_t),IsSet=ARRAYBEGIN(Values->Name,int);v!=ARRAYEND(Values->Value,uint8_t);v+=Values->ValueSize,++IsSet) - { - if (EqData(Type & TYPE_MASK,a,v,Values->ValueSize)) - return (*IsSet!=0); - } - return 0; - } return EqData(Type & TYPE_MASK,a,b,Node_MaxDataSize(p,Id,Type,META_PARAM_GET)); } @@ -2007,26 +1994,6 @@ NOINLINE size_t Node_MaxDataSize(node* p, dataid Id, dataflags Flags, int QueryT if (Flags == 0) return 0; - if (Id < (DATA_ENUM_MULTI*2)) // a normal ID (instead of a class ID, sometimes) - { - if (Id & DATA_ENUM) - { - if (QueryType==META_PARAM_GET) - Flags = TYPE_ENUM; - else - if (QueryType==META_PARAM_SET) - Flags = TYPE_STRING; - } - if (Id & DATA_ENUM_MULTI) - { - if (QueryType==META_PARAM_GET) - Flags = TYPE_ENUM; - else - if (QueryType==META_PARAM_SET) - Flags = TYPE_ENUM_MULTI_SET; - } - } - assert(Flags < MAX_PARAMTYPE); Size = ParamSize[Flags]; if (Size == MAXDATA && Flags != TYPE_STRING) // we don't care about how much space the non-dynamic string needs (except in MetaSet()) @@ -2819,7 +2786,6 @@ static NOINLINE void CopyData(const nodeclass* Class, node* p, node* Src, array* if (Type != TYPE_EXPR) // batch expressions are already copied { size_t Size = Node_MaxDataSize(Src,Id,Type,META_PARAM_GET); - assert((Id & ~DATA_ENUM)==Id); if (Size && Node_Get(Src,Id,Data,Size) == ERR_NONE) { if (Type == TYPE_PIN) diff --git a/corec/corec/node/node.h b/corec/corec/node/node.h index 991dfb40..87dfd4ec 100644 --- a/corec/corec/node/node.h +++ b/corec/corec/node/node.h @@ -36,10 +36,6 @@ extern "C" { #endif -#include "corec/array/array.h" -#include "corec/str/str.h" -#include "corec/memheap.h" - #if defined(corec_EXPORTS) #define NODE_DLL DLLEXPORT #elif defined(NODE_IMPORTS) @@ -50,7 +46,6 @@ extern "C" { #include "nodebase.h" #include "nodetree.h" -#include "nodetools.h" #ifdef __cplusplus } diff --git a/corec/corec/node/nodebase.h b/corec/corec/node/nodebase.h index 1ef15d7a..529c42ea 100644 --- a/corec/corec/node/nodebase.h +++ b/corec/corec/node/nodebase.h @@ -30,6 +30,8 @@ #ifndef __NODEBASE_H #define __NODEBASE_H +#include + #define MAXDATA (MAXPATH*sizeof(tchar_t)) //---------------------------------------------------------------- @@ -45,7 +47,7 @@ #define TYPE_FOURCC 8 // fourcc_t #define TYPE_FILEPOS 9 // filepos_t #define TYPE_NODE 10 // node* (format1: node class) -#define TYPE_META 11 // metanotify +#define TYPE_META 11 #define TYPE_PACKET 12 // flow packet pin #define TYPE_TICK 13 // tick_t #define TYPE_NODENOTIFY 14 // nodenotify (private) @@ -71,9 +73,9 @@ #define TYPE_DBNO 34 // db_no #define TYPE_GUID 35 // cc_guid #define TYPE_FIX16 36 // int -#define TYPE_LUA_REF 37 // int +#define TYPE_LUA_REF 37 #define TYPE_NOTIFYEX 38 -#define TYPE_ENUM 39 // dataenum +#define TYPE_ENUM 39 #define TYPE_ENUM_MULTI_SET 40 // multi_enum_set #define TYPE_SIZE 41 // size_t @@ -91,16 +93,12 @@ #define TFLAG_INPUT 0x00001000 #define TFLAG_OUTPUT 0x00002000 #define TFLAG_NOSAVE 0x00004000 -#define TFLAG_ENUM 0x00008000 // Id|DATA_ENUM can be used #define TFLAG_NOTIFY 0x00010000 #define TFLAG_UPDATEMODE 0x00020000 #define TFLAG_NODUMP 0x00040000 #define TFLAG_HOTKEY 0x00080000 #define TFLAG_DISPLAY 0x00100000 #define TFLAG_AVAILABLE 0x00200000 // Id|DATA_AVAILABLE can be used -// TFLAG_ENUM (sub)flags -#define TFLAG_EDITABLE_ENUM 0x00400000 -#define TFLAG_MULTI_ENUM 0x00800000 // Id|DATA_ENUM_MULTI can be used #define TFLAG_POPUP 0x01000000 #define TUNIT_SHIFT 24 @@ -119,11 +117,10 @@ #define TUNIT_PASSWORD 0x0C000000 // TODO: not really units use the old TFORMAT_ for that (and a TFORMAT_MASK as well) #define TUNIT_UPPER 0x0D000000 -#define TUNIT_HOTKEY 0x0E000000 -#define TUNIT_CHECKLIST 0x0F000000 // TYPE_BOOLEAN only -#define TUNIT_PERCENT 0x10000000 -#define TUNIT_HEX 0x11000000 -#define TUNIT_TASK 0x12000000 // TYPE_BOOLEAN only +#define TUNIT_CHECKLIST 0x0E000000 // TYPE_BOOLEAN only +#define TUNIT_PERCENT 0x0F000000 +#define TUNIT_HEX 0x10000000 +#define TUNIT_TASK 0x11000000 // TYPE_BOOLEAN only typedef uint_fast32_t dataid; typedef uint_fast32_t datatype; @@ -299,16 +296,13 @@ struct nodedata //--------------------------------------------------------------- // dataid modifiers (max is 0x800000) -#define DATA_ENUM 0x10000 // get:dataenum / set:add named_value / unset:delete value #define DATA_ICON 0x20000 // tchar_t* #define DATA_AVAILABLE 0x40000 // bool_t #define DATA_UPDATEMODE 0x80000 // bool_t #define DATA_DYNNAME 0x100000 // tchar_t* -#define DATA_ENUM_MULTI 0x200000 // get:dataenum (with .Name a int flag to tell the status of each value) / set:individual value via multi_enum_set -// TODO: use a new dataenumex type for DATA_ENUM_MULTI -#define DataidBase(Id) ((Id) & ~(DATA_ENUM|DATA_ICON|DATA_AVAILABLE|DATA_UPDATEMODE|DATA_DYNNAME|DATA_ENUM_MULTI)) -#define DataidMask(Id) ((Id) & (DATA_ENUM|DATA_ICON|DATA_AVAILABLE|DATA_UPDATEMODE|DATA_DYNNAME|DATA_ENUM_MULTI)) +#define DataidBase(Id) ((Id) & ~(DATA_ICON|DATA_AVAILABLE|DATA_UPDATEMODE|DATA_DYNNAME)) +#define DataidMask(Id) ((Id) & (DATA_ICON|DATA_AVAILABLE|DATA_UPDATEMODE|DATA_DYNNAME)) static INLINE bool_t IsExtendedId(dataid Id, dataid ExtensionStart, size_t ExtensionSize) { @@ -316,14 +310,6 @@ static INLINE bool_t IsExtendedId(dataid Id, dataid ExtensionStart, size_t Exten return (Id >= ExtensionStart && Id < ExtensionStart+ExtensionSize); } -typedef struct dataenum -{ - size_t ValueSize; - array Name; // tchar_t - array Value; // any type - -} dataenum; - typedef struct multi_enum_set { void *Element; @@ -426,16 +412,6 @@ typedef pin nodeevt; typedef err_t (*notifyproc)(void* This, nodeevt* Evt); -typedef void (*metafunc)(void* Referer, fourcc_t Meta, int32_t Stream, const tchar_t* Value); - -typedef struct metanotify -{ - metafunc Func; - void* Referer; - int Stream; - -} metanotify; - typedef err_t (*notifyfunc)(void* This,intptr_t Param,intptr_t Param2); typedef void (*freefunc)(void* This,void *Ptr); @@ -507,11 +483,6 @@ struct nodecontext void (*ExprRelease)(nodeexpr*); size_t (*ExprSize)(nodeexpr*); void (*ExprDup)(node* Node, nodeexpr*, array* Dup); -#if defined(CONFIG_CORELUA) - void *LuaCookie; - void (*LuaRelease)(void* Cookie, int* Ref); - void (*LuaAddRef)(void* Cookie, int* Ref); -#endif void (*ReportError)(nodecontext*, node* Node, fourcc_t MsgClass, int MsgNo, va_list Args); int Build; array Collect; diff --git a/corec/corec/node/nodetools.h b/corec/corec/node/nodetools.h deleted file mode 100644 index 3cf8904e..00000000 --- a/corec/corec/node/nodetools.h +++ /dev/null @@ -1,46 +0,0 @@ -/***************************************************************************** - * - * Copyright (c) 2008-2010, CoreCodec, Inc. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * * Neither the name of CoreCodec, Inc. nor the - * names of its contributors may be used to endorse or promote products - * derived from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY CoreCodec, Inc. ``AS IS'' AND ANY - * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL CoreCodec, Inc. BE LIABLE FOR ANY - * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - ****************************************************************************/ - -#ifndef __NODETOOLS_H -#define __NODETOOLS_H - -//some helper functions - -static INLINE bool_t EqFrac(const cc_fraction* a, const cc_fraction* b) -{ - if (a->Den == b->Den && a->Num == b->Num) - return 1; - if (!a->Den) return b->Den==0; - if (!b->Den) return 0; - return (int64_t)b->Den * a->Num == (int64_t)a->Den * b->Num; -} - -NODE_DLL int ScaleRound(int_fast32_t v,int_fast32_t Num,int_fast32_t Den); - -#endif diff --git a/corec/corec/node/nodetree.c b/corec/corec/node/nodetree.c index 8984993a..c10bf608 100644 --- a/corec/corec/node/nodetree.c +++ b/corec/corec/node/nodetree.c @@ -28,6 +28,7 @@ ****************************************************************************/ #include "node.h" +#include static NOINLINE err_t SetParent(nodetree* p,nodetree* Parent,nodetree* Before) { diff --git a/corec/corec/str/str.c b/corec/corec/str/str.c index 1760d5da..c697838d 100644 --- a/corec/corec/str/str.c +++ b/corec/corec/str/str.c @@ -824,16 +824,6 @@ static int var_stscanf_s(const tchar_t* In, size_t *InLen, const tchar_t* Mask, return n; } -int stscanf_s(const tchar_t* In, size_t *InLen, const tchar_t* Mask, ...) -{ - int n; - va_list Arg; - va_start(Arg, Mask); - n = var_stscanf_s(In,InLen,Mask,Arg); - va_end(Arg); - return n; -} - int stscanf(const tchar_t* In, const tchar_t* Mask, ...) { int n; @@ -905,41 +895,6 @@ size_t utf16len(const utf16_t *In) return Result; } -tchar_t* tcsreplace(tchar_t* Out, size_t OutLen, const tchar_t *Src, const tchar_t *Dst) -{ - tchar_t *s = tcsstr(Out,Src); - if (s) - { - size_t SrcLen,DstLen,Remain; - SrcLen = tcslen(Src); - DstLen = tcslen(Dst); - do - { - Remain = tcslen(s); - if (SrcLen < DstLen) - { - if (Remain + (DstLen-SrcLen) >= OutLen - (s-Out)) - return 0; // not enough room - memmove(s+DstLen-SrcLen,s,(Remain+1)*sizeof(tchar_t)); - } - else - memmove(s,s+SrcLen-DstLen,(Remain+1)*sizeof(tchar_t)); - memcpy(s,Dst,DstLen*sizeof(tchar_t)); - s += DstLen; - } while ((s=tcsstr(s,Src))); - } - return Out; -} - -tchar_t* tcsreplacechar(tchar_t *ts, tchar_t From, tchar_t To) -{ - tchar_t *p; - for (p=ts;*p;++p) - if (*p == From) - *p = To; - return ts; -} - size_t FourCCToString(tchar_t* Out, size_t OutLen, fourcc_t FourCC) { size_t i=0; diff --git a/corec/corec/str/str.h b/corec/corec/str/str.h index 53fe35df..bee24360 100644 --- a/corec/corec/str/str.h +++ b/corec/corec/str/str.h @@ -30,7 +30,7 @@ #ifndef __STR_H #define __STR_H -#include "corec/corec.h" +#include #ifdef __cplusplus extern "C" { @@ -67,23 +67,12 @@ STR_DLL tchar_t* tcsncpy_s(tchar_t* Out,size_t OutLen,const tchar_t* In,size_t n STR_DLL tchar_t* tcscat_s(tchar_t* Out,size_t OutLen,const tchar_t* In); STR_DLL tchar_t* tcsncat_s(tchar_t* Out,size_t OutLen,const tchar_t* In,size_t n); STR_DLL int stscanf(const tchar_t* In, const tchar_t* Mask, ...); -STR_DLL int stscanf_s(const tchar_t* In, size_t *InLen, const tchar_t* Mask, ...); STR_DLL void stprintf_s(tchar_t* Out,size_t OutLen,const tchar_t* Mask, ...); STR_DLL void stcatprintf_s(tchar_t* Out,size_t OutLen,const tchar_t* Mask, ...); STR_DLL void vstprintf_s(tchar_t* Out,size_t OutLen,const tchar_t* Mask,va_list Arg); -STR_DLL tchar_t* tcsreplace(tchar_t* Out,size_t OutLen, const tchar_t *Src, const tchar_t *Dst); -STR_DLL tchar_t* tcsreplacechar(tchar_t *ts, tchar_t From, tchar_t To); - STR_DLL size_t FourCCToString(tchar_t* Out, size_t OutLen, fourcc_t FourCC); -static INLINE tchar_t* tcsclr_s(tchar_t *ts, size_t len) -{ - if (ts && len) - *ts = 0; - return ts; -} - STR_DLL size_t utf16len(const utf16_t *); #ifndef stricmp diff --git a/corec/tests/file_test.c b/corec/tests/file_test.c index 7fc30b3e..b7616445 100644 --- a/corec/tests/file_test.c +++ b/corec/tests/file_test.c @@ -1,4 +1,5 @@ -#include "corec/helpers/file/file.h" +#include +#include #include void DebugMessage(const tchar_t* Msg,...) @@ -11,7 +12,11 @@ void DebugMessage(const tchar_t* Msg,...) va_end(Args); tcscat_s(Buffer,TSIZEOF(Buffer),T("\r\n")); +#ifdef UNICODE + fprintf(stderr, "%ls", Buffer); +#else fprintf(stderr, "%s", Buffer); +#endif } int main(int argc,char** argv) diff --git a/corec/tests/node_test.c b/corec/tests/node_test.c index a182ba2d..61a27d7d 100644 --- a/corec/tests/node_test.c +++ b/corec/tests/node_test.c @@ -1,4 +1,5 @@ -#include "corec/node/node.h" +#include +#include #include void DebugMessage(const tchar_t* Msg,...) @@ -11,7 +12,11 @@ void DebugMessage(const tchar_t* Msg,...) va_end(Args); tcscat_s(Buffer,TSIZEOF(Buffer),T("\r\n")); +#ifdef UNICODE + fprintf(stderr, "%ls", Buffer); +#else fprintf(stderr, "%s", Buffer); +#endif } int main(int argc,char** argv) diff --git a/corec/tests/string_test.c b/corec/tests/string_test.c index 806bb038..06a655d9 100644 --- a/corec/tests/string_test.c +++ b/corec/tests/string_test.c @@ -1,9 +1,9 @@ #include "corec/str/str.h" #if defined(UNICODE) -#include "corec/helpers/charconvert/charconvert.h" -charconv *ToStr; -charconv *FromStr; +#include +struct charconv *ToStr; +struct charconv *FromStr; #endif #include diff --git a/libebml2/ebml2/ebml.h b/libebml2/ebml2/ebml.h index 9b46d8e7..b2d43f75 100644 --- a/libebml2/ebml2/ebml.h +++ b/libebml2/ebml2/ebml.h @@ -29,8 +29,8 @@ #ifndef LIBEBML2_H #define LIBEBML2_H -#include "corec/node/node.h" -#include "corec/helpers/parser/parser.h" +#include +#include #include "ebml2/ebml_config.h" #ifdef __cplusplus @@ -112,9 +112,9 @@ typedef struct ebml_element_vmt { nodetree_vmt Base; bool_t (*ValidateSize)(const void*); - err_t (*ReadData)(void*, stream *Input, const ebml_parser_context *ParserContext, bool_t AllowDummyElt, int Scope, size_t DepthCheckCRC); + err_t (*ReadData)(void*, struct stream *Input, const ebml_parser_context *ParserContext, bool_t AllowDummyElt, int Scope, size_t DepthCheckCRC); #if defined(CONFIG_EBML_WRITING) - err_t (*RenderData)(void*, stream *Output, bool_t bForceWithoutMandatory, bool_t bWithDefault, int ForProfile, filepos_t *Rendered); + err_t (*RenderData)(void*, struct stream *Output, bool_t bForceWithoutMandatory, bool_t bWithDefault, int ForProfile, filepos_t *Rendered); #endif bool_t (*IsDefaultValue)(const void*); bool_t (*DefaultIsSet)(const void*); @@ -141,8 +141,8 @@ EBML_DLL err_t EBML_Init(parsercontext *p); EBML_DLL ebml_element *EBML_ElementCreate(anynode *Any, const ebml_context *Context, bool_t SetDefault, int ForProfile); -EBML_DLL ebml_element *EBML_FindNextId(stream *Input, const ebml_context *Context, size_t MaxDataSize); -EBML_DLL ebml_element *EBML_FindNextElement(stream *Input, const ebml_parser_context *Context, int *UpperLevels, bool_t AllowDummy); +EBML_DLL ebml_element *EBML_FindNextId(struct stream *Input, const ebml_context *Context, size_t MaxDataSize); +EBML_DLL ebml_element *EBML_FindNextElement(struct stream *Input, const ebml_parser_context *Context, int *UpperLevels, bool_t AllowDummy); EBML_DLL uint8_t EBML_CodedSizeLength(filepos_t Length, uint8_t SizeLength, bool_t bSizeIsFinite); // TODO: turn into a macro ? EBML_DLL uint8_t EBML_CodedSizeLengthSigned(filepos_t Length, uint8_t SizeLength); // TODO: turn into a macro ? EBML_DLL uint8_t EBML_CodedValueLength(filepos_t Length, size_t CodedSize, uint8_t *OutBuffer, bool_t bSizeIsFinite); // TODO: turn into a macro ? @@ -155,7 +155,7 @@ EBML_DLL const char *EBML_ElementGetClassName(const ebml_element *Element); EBML_DLL const ebml_context *EBML_ElementContext(const ebml_element *Element); -EBML_DLL ebml_element *EBML_ElementSkipData(ebml_element *Element, stream *Input, const ebml_parser_context *Context, ebml_element *TestReadElt, bool_t AllowDummy); +EBML_DLL ebml_element *EBML_ElementSkipData(ebml_element *Element, struct stream *Input, const ebml_parser_context *Context, ebml_element *TestReadElt, bool_t AllowDummy); EBML_DLL bool_t EBML_ElementIsFiniteSize(const ebml_element *Element); EBML_DLL void EBML_ElementSetInfiniteSize(const ebml_element *Element, bool_t Set); EBML_DLL bool_t EBML_ElementIsDummy(const ebml_element *Element); @@ -174,8 +174,8 @@ EBML_DLL bool_t EBML_ElementIsType(const ebml_element *Element, const ebml_conte #if defined(CONFIG_EBML_WRITING) // TODO: replace the list of bools by flags ? -EBML_DLL err_t EBML_ElementRender(ebml_element *Element, stream *Output, bool_t bWithDefault, bool_t bKeepPosition, bool_t bForceWithoutMandatory, int ForProfile, filepos_t *Rendered); -EBML_DLL err_t EBML_ElementRenderHead(ebml_element *Element, stream *Output, bool_t bKeepPosition, filepos_t *Rendered); +EBML_DLL err_t EBML_ElementRender(ebml_element *Element, struct stream *Output, bool_t bWithDefault, bool_t bKeepPosition, bool_t bForceWithoutMandatory, int ForProfile, filepos_t *Rendered); +EBML_DLL err_t EBML_ElementRenderHead(ebml_element *Element, struct stream *Output, bool_t bKeepPosition, filepos_t *Rendered); #endif #if defined(EBML2_UGLY_HACKS_API) @@ -224,7 +224,7 @@ EBML_DLL const uint8_t *EBML_BinaryGetData(ebml_binary *Element); #if defined(CONFIG_EBML_WRITING) EBML_DLL bool_t EBML_VoidSetFullSize(ebml_element *Void, filepos_t); -EBML_DLL filepos_t EBML_VoidReplaceWith(ebml_element *Void, ebml_element *Replaced, stream *Output, bool_t ComeBackAfterward, bool_t bWithDefault); +EBML_DLL filepos_t EBML_VoidReplaceWith(ebml_element *Void, ebml_element *Replaced, struct stream *Output, bool_t ComeBackAfterward, bool_t bWithDefault); #endif EBML_DLL size_t EBML_FillBufferID(uint8_t *Buffer, size_t BufSize, fourcc_t Id); EBML_DLL size_t EBML_IdToString(tchar_t *Out, size_t OutLen, fourcc_t Id); diff --git a/libebml2/ebml2/ebml_classes.h b/libebml2/ebml2/ebml_classes.h index fcc3d4d0..8de38785 100644 --- a/libebml2/ebml2/ebml_classes.h +++ b/libebml2/ebml2/ebml_classes.h @@ -33,7 +33,7 @@ * ONLY INCLUDE THIS FILE IF YOU PLAN TO CREATE YOUR OWN EBML-BASED CLASS */ -#include "corec/node/node.h" +#include #ifdef __cplusplus extern "C" { diff --git a/libebml2/ebmlbinary.c b/libebml2/ebmlbinary.c index e4fe6d37..bc4a173c 100644 --- a/libebml2/ebmlbinary.c +++ b/libebml2/ebmlbinary.c @@ -27,8 +27,9 @@ */ #include "ebml2/ebml.h" #include "internal.h" +#include -static err_t ReadData(ebml_binary *Element, stream *Input, const ebml_parser_context *ParserContext, bool_t AllowDummyElt, int Scope, size_t DepthCheckCRC) +static err_t ReadData(ebml_binary *Element, struct stream *Input, const ebml_parser_context *ParserContext, bool_t AllowDummyElt, int Scope, size_t DepthCheckCRC) { err_t Result; @@ -62,7 +63,7 @@ static err_t ReadData(ebml_binary *Element, stream *Input, const ebml_parser_con } #if defined(CONFIG_EBML_WRITING) -static err_t RenderData(ebml_binary *Element, stream *Output, bool_t bForceWithoutMandatory, bool_t bWithDefault, int ForProfile, filepos_t *Rendered) +static err_t RenderData(ebml_binary *Element, struct stream *Output, bool_t bForceWithoutMandatory, bool_t bWithDefault, int ForProfile, filepos_t *Rendered) { size_t Written; err_t Err = Stream_Write(Output,ARRAYBEGIN(Element->Data,uint8_t),ARRAYCOUNT(Element->Data,uint8_t),&Written); diff --git a/libebml2/ebmlcrc.c b/libebml2/ebmlcrc.c index 82c83e84..10082f0a 100644 --- a/libebml2/ebmlcrc.c +++ b/libebml2/ebmlcrc.c @@ -27,6 +27,7 @@ */ #include "ebml2/ebml.h" #include "internal.h" +#include struct ebml_crc { @@ -160,7 +161,7 @@ static bool_t ValidateSize(const ebml_element *p) return EBML_ElementIsFiniteSize(p) && (p->DataSize == 4); } -static err_t ReadData(ebml_crc *Element, stream *Input, const ebml_parser_context *ParserContext, bool_t AllowDummyElt, int Scope, size_t DepthCheckCRC) +static err_t ReadData(ebml_crc *Element, struct stream *Input, const ebml_parser_context *ParserContext, bool_t AllowDummyElt, int Scope, size_t DepthCheckCRC) { err_t Result; uint32_t CRCbuffer; @@ -174,7 +175,7 @@ static err_t ReadData(ebml_crc *Element, stream *Input, const ebml_parser_contex } #if defined(CONFIG_EBML_WRITING) -static err_t RenderData(ebml_crc *Element, stream *Output, bool_t bForceWithoutMandatory, bool_t bWithDefault, int ForProfile, filepos_t *Rendered) +static err_t RenderData(ebml_crc *Element, struct stream *Output, bool_t bForceWithoutMandatory, bool_t bWithDefault, int ForProfile, filepos_t *Rendered) { err_t Result; size_t Written = 0; diff --git a/libebml2/ebmldate.c b/libebml2/ebmldate.c index 1e0c67d6..ad43789a 100644 --- a/libebml2/ebmldate.c +++ b/libebml2/ebmldate.c @@ -27,6 +27,7 @@ */ #include "ebml2/ebml.h" #include "internal.h" +#include datetime_t EBML_DateTime(const ebml_date *Element) { @@ -49,7 +50,7 @@ static bool_t ValidateSize(const ebml_element *p) return EBML_ElementIsFiniteSize(p) && (p->DataSize == 8 || p->DataSize == 0); } -static err_t ReadData(ebml_date *Element, stream *Input, const ebml_parser_context *ParserContext, bool_t AllowDummyElt, int Scope, size_t DepthCheckCRC) +static err_t ReadData(ebml_date *Element, struct stream *Input, const ebml_parser_context *ParserContext, bool_t AllowDummyElt, int Scope, size_t DepthCheckCRC) { err_t Result; int DataSize; diff --git a/libebml2/ebmlelement.c b/libebml2/ebmlelement.c index f640275c..35a90e19 100644 --- a/libebml2/ebmlelement.c +++ b/libebml2/ebmlelement.c @@ -27,6 +27,8 @@ */ #include "ebml2/ebml.h" #include "internal.h" +#include +#include static bool_t ValidateSize(const ebml_element *p) { @@ -110,7 +112,7 @@ bool_t EBML_ElementIsDummy(const ebml_element *Element) return Node_IsPartOf(Element,EBML_DUMMY_ID); } -ebml_element *EBML_ElementSkipData(ebml_element *p, stream *Input, const ebml_parser_context *Context, ebml_element *TestReadElt, bool_t AllowDummyElt) +ebml_element *EBML_ElementSkipData(ebml_element *p, struct stream *Input, const ebml_parser_context *Context, ebml_element *TestReadElt, bool_t AllowDummyElt) { ebml_element *Result = NULL; if (EBML_ElementIsFiniteSize(p)) { @@ -275,7 +277,7 @@ fourcc_t EBML_BufferToID(const uint8_t *Buffer) } #if defined(CONFIG_EBML_WRITING) -err_t EBML_ElementRender(ebml_element *Element, stream *Output, bool_t bWithDefault, bool_t bKeepPosition, bool_t bForceWithoutMandatory, int ForProfile, filepos_t *Rendered) +err_t EBML_ElementRender(ebml_element *Element, struct stream *Output, bool_t bWithDefault, bool_t bKeepPosition, bool_t bForceWithoutMandatory, int ForProfile, filepos_t *Rendered) { err_t Result; filepos_t _Rendered,WrittenSize; @@ -319,7 +321,7 @@ err_t EBML_ElementRender(ebml_element *Element, stream *Output, bool_t bWithDefa return Result; } -err_t EBML_ElementRenderHead(ebml_element *Element, stream *Output, bool_t bKeepPosition, filepos_t *Rendered) +err_t EBML_ElementRenderHead(ebml_element *Element, struct stream *Output, bool_t bKeepPosition, filepos_t *Rendered) { err_t Err; uint8_t FinalHead[4+8]; // Class D + 64 bits coded size diff --git a/libebml2/ebmlmain.c b/libebml2/ebmlmain.c index b3f3b5cf..217de659 100644 --- a/libebml2/ebmlmain.c +++ b/libebml2/ebmlmain.c @@ -27,6 +27,7 @@ */ #include "ebml2/ebml.h" #include "internal.h" +#include err_t EBML_Init(parsercontext *p) { @@ -319,7 +320,7 @@ static ebml_element *EBML_ElementCreateUsingContext(void *AnyNode, const uint8_t return Result; } -ebml_element *EBML_FindNextId(stream *Input, const ebml_context *Context, size_t MaxDataSize) +ebml_element *EBML_FindNextId(struct stream *Input, const ebml_context *Context, size_t MaxDataSize) { filepos_t aElementPosition, aSizePosition; filepos_t SizeFound=0, SizeUnknown=8; @@ -488,7 +489,7 @@ uint8_t EBML_CodedValueLengthSigned(filepos_t Length, size_t CodedSize, uint8_t } -ebml_element *EBML_FindNextElement(stream *Input, const ebml_parser_context *pContext, int *UpperLevels, bool_t AllowDummyElt) +ebml_element *EBML_FindNextElement(struct stream *Input, const ebml_parser_context *pContext, int *UpperLevels, bool_t AllowDummyElt) { uint8_t PossibleID_Length = 0; uint8_t PossibleIdNSize[16]; diff --git a/libebml2/ebmlmaster.c b/libebml2/ebmlmaster.c index 3baa9069..456383ad 100644 --- a/libebml2/ebmlmaster.c +++ b/libebml2/ebmlmaster.c @@ -28,6 +28,7 @@ #include "ebml2/ebml.h" #include "internal.h" #include "ebmlcrc.h" +#include ebml_element *EBML_MasterAddElt(ebml_master *Element, const ebml_context *Context, bool_t SetDefault, int ForProfile) { @@ -295,13 +296,13 @@ static void PostCreate(ebml_master *Element, bool_t SetDefault, int ForProfile) } } -static err_t ReadData(ebml_master *Element, stream *Input, const ebml_parser_context *ParserContext, bool_t AllowDummyElt, int Scope, size_t DepthCheckCRC) +static err_t ReadData(ebml_master *Element, struct stream *Input, const ebml_parser_context *ParserContext, bool_t AllowDummyElt, int Scope, size_t DepthCheckCRC) { int UpperEltFound = 0; bool_t bFirst = 1; ebml_element *SubElement; ebml_crc *CRCElement = NULL; - stream *ReadStream = Input; + struct stream *ReadStream = Input; array CrcBuffer; uint8_t *CRCData = NULL; size_t CRCDataSize; @@ -364,7 +365,7 @@ static err_t ReadData(ebml_master *Element, stream *Input, const ebml_parser_con { CRCData = ARRAYBEGIN(CrcBuffer,uint8_t); CRCDataSize = ARRAYCOUNT(CrcBuffer,uint8_t); - ReadStream = (stream*)NodeCreate(Element, MEMSTREAM_CLASS); + ReadStream = (struct stream*)NodeCreate(Element, MEMSTREAM_CLASS); if (ReadStream==NULL) { ReadStream=Input; // revert back to normal reading @@ -465,7 +466,7 @@ bool_t EBML_MasterIsChecksumValid(const ebml_master *Element) } #if defined(CONFIG_EBML_WRITING) -static err_t InternalRender(ebml_master *Element, stream *Output, bool_t bForceWithoutMandatory, bool_t bWithDefault, int ForProfile, filepos_t *Rendered) +static err_t InternalRender(ebml_master *Element, struct stream *Output, bool_t bForceWithoutMandatory, bool_t bWithDefault, int ForProfile, filepos_t *Rendered) { ebml_element *i; filepos_t ItemRendered; @@ -482,7 +483,7 @@ static err_t InternalRender(ebml_master *Element, stream *Output, bool_t bForceW return Err; } -static err_t RenderData(ebml_master *Element, stream *Output, bool_t bForceWithoutMandatory, bool_t bWithDefault, int ForProfile, filepos_t *Rendered) +static err_t RenderData(ebml_master *Element, struct stream *Output, bool_t bForceWithoutMandatory, bool_t bWithDefault, int ForProfile, filepos_t *Rendered) { filepos_t _Rendered; err_t Err = ERR_NONE; @@ -521,7 +522,7 @@ static err_t RenderData(ebml_master *Element, stream *Output, bool_t bForceWitho { if (!IsMemory) { - stream *VOutput = (stream*)NodeCreate(Element, MEMSTREAM_CLASS); + stream *VOutput = (struct stream*)NodeCreate(Element, MEMSTREAM_CLASS); if (!VOutput) Err = ERR_OUT_OF_MEMORY; else diff --git a/libebml2/ebmlnumber.c b/libebml2/ebmlnumber.c index dc9be554..a9411ff9 100644 --- a/libebml2/ebmlnumber.c +++ b/libebml2/ebmlnumber.c @@ -27,8 +27,9 @@ */ #include "ebml2/ebml.h" #include "internal.h" +#include -static err_t ReadDataInt(ebml_integer *Element, stream *Input, const ebml_parser_context *ParserContext, bool_t AllowDummyElt, int Scope, size_t DepthCheckCRC) +static err_t ReadDataInt(ebml_integer *Element, struct stream *Input, const ebml_parser_context *ParserContext, bool_t AllowDummyElt, int Scope, size_t DepthCheckCRC) { err_t Result; char Buffer[8]; @@ -67,7 +68,7 @@ static err_t ReadDataInt(ebml_integer *Element, stream *Input, const ebml_parser return Result; } -static err_t ReadDataSignedInt(ebml_integer *Element, stream *Input, const ebml_parser_context *ParserContext, bool_t AllowDummyElt, int Scope, size_t DepthCheckCRC) +static err_t ReadDataSignedInt(ebml_integer *Element, struct stream *Input, const ebml_parser_context *ParserContext, bool_t AllowDummyElt, int Scope, size_t DepthCheckCRC) { err_t Result; char Buffer[8]; @@ -110,7 +111,7 @@ static err_t ReadDataSignedInt(ebml_integer *Element, stream *Input, const ebml_ } #if defined(CONFIG_EBML_WRITING) -static err_t RenderDataSignedInt(ebml_integer *Element, stream *Output, bool_t bForceWithoutMandatory, bool_t bWithDefault, int ForProfile, filepos_t *Rendered) +static err_t RenderDataSignedInt(ebml_integer *Element, struct stream *Output, bool_t bForceWithoutMandatory, bool_t bWithDefault, int ForProfile, filepos_t *Rendered) { uint8_t FinalData[8]; // we don't handle more than 64 bits integers size_t i; @@ -146,7 +147,7 @@ static err_t RenderDataSignedInt(ebml_integer *Element, stream *Output, bool_t b return Err; } -static err_t RenderDataInt(ebml_integer *Element, stream *Output, bool_t bForceWithoutMandatory, bool_t bWithDefault, int ForProfile, filepos_t *Rendered) +static err_t RenderDataInt(ebml_integer *Element, struct stream *Output, bool_t bForceWithoutMandatory, bool_t bWithDefault, int ForProfile, filepos_t *Rendered) { uint8_t FinalData[8]; // we don't handle more than 64 bits integers size_t i; @@ -182,7 +183,7 @@ static err_t RenderDataInt(ebml_integer *Element, stream *Output, bool_t bForceW return Err; } -static err_t RenderDataFloat(ebml_float *Element, stream *Output, bool_t bForceWithoutMandatory, bool_t bWithDefault, int ForProfile, filepos_t *Rendered) +static err_t RenderDataFloat(ebml_float *Element, struct stream *Output, bool_t bForceWithoutMandatory, bool_t bWithDefault, int ForProfile, filepos_t *Rendered) { err_t Err; size_t i = 0; @@ -224,7 +225,7 @@ static bool_t ValidateSizeFloat(const ebml_element *p) return EBML_ElementIsFiniteSize(p) && (p->DataSize == 8 || p->DataSize == 4); } -static err_t ReadDataFloat(ebml_float *Element, stream *Input, const ebml_parser_context *ParserContext, bool_t AllowDummyElt, int Scope, size_t DepthCheckCRC) +static err_t ReadDataFloat(ebml_float *Element, struct stream *Input, const ebml_parser_context *ParserContext, bool_t AllowDummyElt, int Scope, size_t DepthCheckCRC) { uint8_t Value[8]; err_t Result; diff --git a/libebml2/ebmlstring.c b/libebml2/ebmlstring.c index d8739d16..ff5f0ed0 100644 --- a/libebml2/ebmlstring.c +++ b/libebml2/ebmlstring.c @@ -27,6 +27,7 @@ */ #include "ebml2/ebml.h" #include "internal.h" +#include err_t EBML_UniStringSetValue(ebml_string *Element,const tchar_t *Value) { @@ -65,7 +66,7 @@ void EBML_StringGet(ebml_string *Element,tchar_t *Out, size_t OutLen) } } -static err_t ReadData(ebml_string *Element, stream *Input, const ebml_parser_context *ParserContext, bool_t AllowDummyElt, int Scope, size_t DepthCheckCRC) +static err_t ReadData(ebml_string *Element, struct stream *Input, const ebml_parser_context *ParserContext, bool_t AllowDummyElt, int Scope, size_t DepthCheckCRC) { err_t Result; char *Buffer = NULL; @@ -110,7 +111,7 @@ static err_t ReadData(ebml_string *Element, stream *Input, const ebml_parser_con } #if defined(CONFIG_EBML_WRITING) -static err_t RenderData(ebml_string *Element, stream *Output, bool_t bForceWithoutMandatory, bool_t bWithDefault, int ForProfile, filepos_t *Rendered) +static err_t RenderData(ebml_string *Element, struct stream *Output, bool_t bForceWithoutMandatory, bool_t bWithDefault, int ForProfile, filepos_t *Rendered) { size_t Written; err_t Err = Stream_Write(Output,Element->Buffer,(size_t)Element->Base.DataSize,&Written); @@ -132,7 +133,7 @@ static err_t RenderData(ebml_string *Element, stream *Output, bool_t bForceWitho #endif #if 0 -err_t EBML_AsciiStringRead(ebml_string *Element, stream *Input, tchar_t *Out, size_t OutLen) +err_t EBML_AsciiStringRead(ebml_string *Element, struct stream *Input, tchar_t *Out, size_t OutLen) { if (Node_IsPartOf(Element,EBML_STRING_CLASS)) return ERR_INVALID_DATA; @@ -146,7 +147,7 @@ err_t EBML_AsciiStringRead(ebml_string *Element, stream *Input, tchar_t *Out, si } } -err_t EBML_UnicodeStringRead(ebml_string *Element, stream *Input, tchar_t *Out, size_t OutLen) +err_t EBML_UnicodeStringRead(ebml_string *Element, struct stream *Input, tchar_t *Out, size_t OutLen) { if (Node_IsPartOf(Element,EBML_UNISTRING_CLASS)) return ERR_INVALID_DATA; diff --git a/libebml2/ebmlvoid.c b/libebml2/ebmlvoid.c index 080e8502..0861d06c 100644 --- a/libebml2/ebmlvoid.c +++ b/libebml2/ebmlvoid.c @@ -27,20 +27,21 @@ */ #include "ebml2/ebml.h" #include "internal.h" +#include static bool_t IsDefaultValue(const ebml_element *Element) { return 0; } -static err_t ReadData(ebml_element *Element, stream *Input, const ebml_parser_context *ParserContext, bool_t AllowDummyElt, int Scope, size_t DepthCheckCRC) +static err_t ReadData(ebml_element *Element, struct stream *Input, const ebml_parser_context *ParserContext, bool_t AllowDummyElt, int Scope, size_t DepthCheckCRC) { EBML_ElementSkipData(Element,Input,ParserContext,NULL,AllowDummyElt); return ERR_NONE; } #if defined(CONFIG_EBML_WRITING) -static err_t RenderData(ebml_element *Element, stream *Output, bool_t bForceWithoutMandatory, bool_t bWithDefault, int ForProfile, filepos_t *Rendered) +static err_t RenderData(ebml_element *Element, struct stream *Output, bool_t bForceWithoutMandatory, bool_t bWithDefault, int ForProfile, filepos_t *Rendered) { size_t Written, Left = (size_t)Element->DataSize; err_t Err = ERR_NONE; @@ -93,7 +94,7 @@ bool_t EBML_VoidSetFullSize(ebml_element *Void, filepos_t DataSize) return Void->DataSize >= 0; } -filepos_t EBML_VoidReplaceWith(ebml_element *Void, ebml_element *ReplacedWith, stream *Output, bool_t ComeBackAfterward, bool_t bWithDefault) +filepos_t EBML_VoidReplaceWith(ebml_element *Void, ebml_element *ReplacedWith, struct stream *Output, bool_t ComeBackAfterward, bool_t bWithDefault) { filepos_t CurrentPosition; assert(Node_IsPartOf(Void,EBML_VOID_CLASS)); diff --git a/libebml2/legacy/legacy.cpp b/libebml2/legacy/legacy.cpp index 225d46bc..28ae0fe0 100644 --- a/libebml2/legacy/legacy.cpp +++ b/libebml2/legacy/legacy.cpp @@ -48,6 +48,9 @@ #include "ebml2/ebml.h" +#include +#include + #define IOCALLBACK_STREAM_CLASS FOURCC('I','O','C','B') #define Ebml_Children(x) (ebml_element*)NodeTree_Children(x) @@ -1068,7 +1071,7 @@ EbmlUnicodeString::operator const UTFstring() const { ebml_string *Value = (ebml_string*)Node; wchar_t TmpStr[MAXLINE]; - charconv *c = CharConvOpen(CHARSET_UTF8,CHARSET_WCHAR); + struct charconv *c = CharConvOpen(CHARSET_UTF8,CHARSET_WCHAR); CharConvTS(c, TmpStr, sizeof(TmpStr)/sizeof(wchar_t),Value->Buffer); CharConvClose(c); return UTFstring(TmpStr); diff --git a/libebml2/test/ebmltree.c b/libebml2/test/ebmltree.c index cfe16ba6..a10737f6 100644 --- a/libebml2/test/ebmltree.c +++ b/libebml2/test/ebmltree.c @@ -29,6 +29,9 @@ #include #include "ebml2/ebml.h" +#include +#include +#include void DebugMessage(const tchar_t* Msg,...) { @@ -40,10 +43,14 @@ void DebugMessage(const tchar_t* Msg,...) va_end(Args); tcscat_s(Buffer,TSIZEOF(Buffer),T("\r\n")); +#ifdef UNICODE + fprintf(stderr, "%ls", Buffer); +#else fprintf(stderr, "%s", Buffer); +#endif } -static ebml_element *OutputElement(ebml_element *Element, const ebml_parser_context *Context, stream *Input, int *Level) +static ebml_element *OutputElement(ebml_element *Element, const ebml_parser_context *Context, struct stream *Input, int *Level) { int LevelPrint; for (LevelPrint=0;LevelPrint<*Level;++LevelPrint) @@ -171,7 +178,7 @@ static ebml_element *OutputElement(ebml_element *Element, const ebml_parser_cont return NULL; } -static void OutputTree(stream *Input) +static void OutputTree(struct stream *Input) { ebml_element *Element = EBML_ElementCreate(Input,EBML_getContextHead(),0, EBML_ANY_PROFILE); if (Element) @@ -185,7 +192,7 @@ static void OutputTree(stream *Input) int main(int argc, const char *argv[]) { parsercontext p; - stream *Input; + struct stream *Input; if (argc != 2) { diff --git a/libmatroska2/MatroskaParser/MatroskaParser.c b/libmatroska2/MatroskaParser/MatroskaParser.c index 567289c7..1f4b6070 100644 --- a/libmatroska2/MatroskaParser/MatroskaParser.c +++ b/libmatroska2/MatroskaParser/MatroskaParser.c @@ -35,6 +35,11 @@ #define snprintf _snprintf #endif +#ifndef EOF +#define EOF (-1) +#endif + + const nodemeta HaaliStream_Class[]; #define HAALI_STREAM_CLASS FOURCC('H','A','L','S') @@ -203,7 +208,7 @@ static bool_t parseSeekHead(ebml_element *SeekHead, MatroskaFile *File, char *er else RContext.EndPosition = INVALID_FILEPOS_T; RContext.UpContext = &File->L1Context; - if (EBML_ElementReadData(SeekHead,(stream*)File->Input,&RContext,1,SCOPE_ALL_DATA)!=ERR_NONE) + if (EBML_ElementReadData(SeekHead,(struct stream*)File->Input,&RContext,1,SCOPE_ALL_DATA)!=ERR_NONE) { strncpy(err_msg,"Failed to read the EBML head",err_msgSize); return 0; @@ -249,7 +254,7 @@ static bool_t parseSegmentInfo(ebml_element *SegmentInfo, MatroskaFile *File, ch else RContext.EndPosition = INVALID_FILEPOS_T; RContext.UpContext = &File->L1Context; - if (EBML_ElementReadData(SegmentInfo,(stream*)File->Input,&RContext,1,SCOPE_ALL_DATA)!=ERR_NONE) + if (EBML_ElementReadData(SegmentInfo,(struct stream*)File->Input,&RContext,1,SCOPE_ALL_DATA)!=ERR_NONE) { strncpy(err_msg,"Failed to read the Segment Info",err_msgSize); File->pSegmentInfo = INVALID_FILEPOS_T; @@ -641,7 +646,7 @@ static bool_t parseTracks(ebml_element *Tracks, MatroskaFile *File, char *err_ms else RContext.EndPosition = INVALID_FILEPOS_T; RContext.UpContext = &File->L1Context; - if (EBML_ElementReadData(Tracks,(stream*)File->Input,&RContext,1,SCOPE_ALL_DATA)!=ERR_NONE) + if (EBML_ElementReadData(Tracks,(struct stream*)File->Input,&RContext,1,SCOPE_ALL_DATA)!=ERR_NONE) { strncpy(err_msg,"Failed to read the Tracks",err_msgSize); File->pTracks = INVALID_FILEPOS_T; @@ -670,7 +675,7 @@ static bool_t parseCues(ebml_element *Cues, MatroskaFile *File, char *err_msg, s else RContext.EndPosition = INVALID_FILEPOS_T; RContext.UpContext = &File->L1Context; - if (EBML_ElementReadData(Cues,(stream*)File->Input,&RContext,1,SCOPE_ALL_DATA)!=ERR_NONE) + if (EBML_ElementReadData(Cues,(struct stream*)File->Input,&RContext,1,SCOPE_ALL_DATA)!=ERR_NONE) { strncpy(err_msg,"Failed to read the Cues",err_msgSize); File->pCues = INVALID_FILEPOS_T; @@ -695,7 +700,7 @@ static bool_t parseAttachments(ebml_element *Attachments, MatroskaFile *File, ch else RContext.EndPosition = INVALID_FILEPOS_T; RContext.UpContext = &File->L1Context; - if (EBML_ElementReadData(Attachments,(stream*)File->Input,&RContext,1,SCOPE_PARTIAL_DATA)!=ERR_NONE) + if (EBML_ElementReadData(Attachments,(struct stream*)File->Input,&RContext,1,SCOPE_PARTIAL_DATA)!=ERR_NONE) { strncpy(err_msg,"Failed to read the Attachments",err_msgSize); File->pAttachments = INVALID_FILEPOS_T; @@ -845,7 +850,7 @@ static bool_t parseChapters(ebml_element *Chapters, MatroskaFile *File, char *er else RContext.EndPosition = INVALID_FILEPOS_T; RContext.UpContext = &File->L1Context; - if (EBML_ElementReadData(Chapters,(stream*)File->Input,&RContext,1,SCOPE_ALL_DATA)!=ERR_NONE) + if (EBML_ElementReadData(Chapters,(struct stream*)File->Input,&RContext,1,SCOPE_ALL_DATA)!=ERR_NONE) { strncpy(err_msg,"Failed to read the Chapters",err_msgSize); File->pChapters = INVALID_FILEPOS_T; @@ -1010,7 +1015,7 @@ static bool_t parseTags(ebml_element *Tags, MatroskaFile *File, char *err_msg, s else RContext.EndPosition = INVALID_FILEPOS_T; RContext.UpContext = &File->L1Context; - if (EBML_ElementReadData(Tags,(stream*)File->Input,&RContext,1,SCOPE_ALL_DATA)!=ERR_NONE) + if (EBML_ElementReadData(Tags,(struct stream*)File->Input,&RContext,1,SCOPE_ALL_DATA)!=ERR_NONE) { strncpy(err_msg,"Failed to read the Tags",err_msgSize); File->pTags = INVALID_FILEPOS_T; @@ -1078,7 +1083,7 @@ MatroskaFile *mkv_Open(InputStream *io, char *err_msg, size_t err_msgSize) File->L0Context.EndPosition = File->Input->io->getfilesize(File->Input->io); File->L0Context.UpContext = NULL; UpperLevel = 0; - Head = EBML_FindNextElement((stream*)File->Input,&File->L0Context,&UpperLevel,0); + Head = EBML_FindNextElement((struct stream*)File->Input,&File->L0Context,&UpperLevel,0); if (!Head) { strncpy(err_msg,"Out of memory",err_msgSize); @@ -1091,7 +1096,7 @@ MatroskaFile *mkv_Open(InputStream *io, char *err_msg, size_t err_msgSize) return NULL; } - if (EBML_ElementReadData(Head,(stream*)File->Input,&File->L0Context,1,SCOPE_ALL_DATA)!=ERR_NONE) + if (EBML_ElementReadData(Head,(struct stream*)File->Input,&File->L0Context,1,SCOPE_ALL_DATA)!=ERR_NONE) { strncpy(err_msg,"Failed to read the EBML head",err_msgSize); NodeDelete((node*)Head); @@ -1104,7 +1109,7 @@ MatroskaFile *mkv_Open(InputStream *io, char *err_msg, size_t err_msgSize) } NodeDelete((node*)Head); - File->Segment = EBML_FindNextElement((stream*)File->Input,&File->L0Context,&UpperLevel,0); + File->Segment = EBML_FindNextElement((struct stream*)File->Input,&File->L0Context,&UpperLevel,0); if (!File->Segment) { strncpy(err_msg,"No segments found in the file",err_msgSize); @@ -1119,7 +1124,7 @@ MatroskaFile *mkv_Open(InputStream *io, char *err_msg, size_t err_msgSize) File->L1Context.EndPosition = INVALID_FILEPOS_T; File->L1Context.UpContext = &File->L0Context; UpperLevel = 0; - Head = EBML_FindNextElement((stream*)File->Input,&File->L1Context,&UpperLevel,0); + Head = EBML_FindNextElement((struct stream*)File->Input,&File->L1Context,&UpperLevel,0); while (Head && (!EBML_ElementIsFiniteSize(File->Segment) || EBML_ElementPositionEnd(File->Segment) >= EBML_ElementPositionEnd(Head))) { if (EBML_ElementClassID(Head) == MATROSKA_getContextSeekHead()->Id) @@ -1152,7 +1157,7 @@ MatroskaFile *mkv_Open(InputStream *io, char *err_msg, size_t err_msgSize) { if (EBML_ElementClassID(Head)==MATROSKA_getContextCluster()->Id && File->pFirstCluster==INVALID_FILEPOS_T) File->pFirstCluster = EBML_ElementPosition(Head); - Elt = EBML_ElementSkipData(Head,(stream*)File->Input,&File->L1Context,NULL,1); + Elt = EBML_ElementSkipData(Head,(struct stream*)File->Input,&File->L1Context,NULL,1); NodeDelete((node*)Head); if (Elt) { @@ -1160,7 +1165,7 @@ MatroskaFile *mkv_Open(InputStream *io, char *err_msg, size_t err_msgSize) continue; } } - Head = EBML_FindNextElement((stream*)File->Input,&File->L1Context,&UpperLevel,0); + Head = EBML_FindNextElement((struct stream*)File->Input,&File->L1Context,&UpperLevel,0); } if (File->CueList && File->SegmentInfo) @@ -1285,7 +1290,7 @@ int mkv_ReadFrame(MatroskaFile *File, int mask, unsigned int *track, ulonglong * for (;;) { if (!Elt) - Elt = EBML_FindNextElement((stream*)File->Input,&File->L1Context,&UpperLevel,0); + Elt = EBML_FindNextElement((struct stream*)File->Input,&File->L1Context,&UpperLevel,0); File->CurrentCluster = Elt; if (!File->CurrentCluster) return EOF; @@ -1299,7 +1304,7 @@ int mkv_ReadFrame(MatroskaFile *File, int mask, unsigned int *track, ulonglong * break; Elt = File->CurrentCluster; - File->CurrentCluster = EBML_ElementSkipData(File->CurrentCluster,(stream*)File->Input,&File->L1Context,NULL,1); + File->CurrentCluster = EBML_ElementSkipData(File->CurrentCluster,(struct stream*)File->Input,&File->L1Context,NULL,1); NodeDelete((node*)Elt); Elt = NULL; } @@ -1322,7 +1327,7 @@ int mkv_ReadFrame(MatroskaFile *File, int mask, unsigned int *track, ulonglong * if (!Elt) { UpperLevel = 0; - Elt = EBML_FindNextElement((stream*)File->Input,&File->ClusterContext,&UpperLevel,1); + Elt = EBML_FindNextElement((struct stream*)File->Input,&File->ClusterContext,&UpperLevel,1); } if (!Elt || UpperLevel>0) { @@ -1335,7 +1340,7 @@ int mkv_ReadFrame(MatroskaFile *File, int mask, unsigned int *track, ulonglong * Skip = 0; if (EBML_ElementClassID(Elt) == MATROSKA_getContextClusterTimestamp()->Id) { - if (EBML_ElementReadData(Elt,(stream*)File->Input,&File->ClusterContext,1, SCOPE_ALL_DATA)!=ERR_NONE) + if (EBML_ElementReadData(Elt,(struct stream*)File->Input,&File->ClusterContext,1, SCOPE_ALL_DATA)!=ERR_NONE) return EOF; // TODO: memory leak Elt2 = EBML_MasterFindFirstElt(File->CurrentCluster,MATROSKA_getContextClusterTimestamp(),1,1); if (!Elt2) @@ -1346,7 +1351,7 @@ int mkv_ReadFrame(MatroskaFile *File, int mask, unsigned int *track, ulonglong * } else if (EBML_ElementClassID(Elt) == MATROSKA_getContextClusterSimpleBlock()->Id) { - if (EBML_ElementReadData(Elt,(stream*)File->Input,&File->ClusterContext,1, SCOPE_PARTIAL_DATA)!=ERR_NONE) + if (EBML_ElementReadData(Elt,(struct stream*)File->Input,&File->ClusterContext,1, SCOPE_PARTIAL_DATA)!=ERR_NONE) return EOF; // TODO: memory leak TrackNum = MATROSKA_BlockTrackNum((matroska_block*)Elt); @@ -1365,7 +1370,7 @@ int mkv_ReadFrame(MatroskaFile *File, int mask, unsigned int *track, ulonglong * } else if (EBML_ElementClassID(Elt) == MATROSKA_getContextClusterBlockGroup()->Id) { - if (EBML_ElementReadData(Elt,(stream*)File->Input,&File->ClusterContext,1, SCOPE_PARTIAL_DATA)!=ERR_NONE) + if (EBML_ElementReadData(Elt,(struct stream*)File->Input,&File->ClusterContext,1, SCOPE_PARTIAL_DATA)!=ERR_NONE) return EOF; // TODO: memory leak Elt2 = EBML_MasterFindFirstElt(Elt, MATROSKA_getContextClusterBlock(), 0, 0); @@ -1394,7 +1399,7 @@ int mkv_ReadFrame(MatroskaFile *File, int mask, unsigned int *track, ulonglong * if (Skip) { Elt2 = Elt; - Elt = EBML_ElementSkipData(Elt2,(stream*)File->Input,&File->L1Context,NULL,1); + Elt = EBML_ElementSkipData(Elt2,(struct stream*)File->Input,&File->L1Context,NULL,1); NodeDelete((node*)Elt2); } } @@ -1433,7 +1438,7 @@ int mkv_ReadFrame(MatroskaFile *File, int mask, unsigned int *track, ulonglong * if (MATROSKA_BlockKeyframe(File->CurrentBlock)) *FrameFlags |= FRAME_KF; } - MATROSKA_BlockSkipToFrame(File->CurrentBlock, (stream*)File->Input, File->CurrentFrame); + MATROSKA_BlockSkipToFrame(File->CurrentBlock, (struct stream*)File->Input, File->CurrentFrame); *FrameRef = File->Input->io->makeref(File->Input->io,MATROSKA_BlockGetLength(File->CurrentBlock,File->CurrentFrame++)); if (File->CurrentFrame >= MATROSKA_BlockGetFrameCount(File->CurrentBlock)) diff --git a/libmatroska2/matroska2/matroska.h b/libmatroska2/matroska2/matroska.h index 6fae6557..76a14a75 100644 --- a/libmatroska2/matroska2/matroska.h +++ b/libmatroska2/matroska2/matroska.h @@ -105,7 +105,7 @@ MATROSKA_DLL uint16_t MATROSKA_BlockTrackNum(const matroska_block *Block); MATROSKA_DLL bool_t MATROSKA_BlockKeyframe(const matroska_block *Block); MATROSKA_DLL bool_t MATROSKA_BlockDiscardable(const matroska_block *Block); MATROSKA_DLL bool_t MATROSKA_BlockLaced(const matroska_block *Block); -MATROSKA_DLL err_t MATROSKA_BlockReadData(matroska_block *Block, stream *Input, int ForProfile); +MATROSKA_DLL err_t MATROSKA_BlockReadData(matroska_block *Block, struct stream *Input, int ForProfile); MATROSKA_DLL err_t MATROSKA_BlockReleaseData(matroska_block *Block, bool_t IncludingNotRead); MATROSKA_DLL uint16_t MATROSKA_CueTrackNum(const matroska_cuepoint *Cue); MATROSKA_DLL void MATROSKA_CuesSort(ebml_master *Cues); @@ -141,10 +141,10 @@ MATROSKA_DLL ebml_element *MATROSKA_BlockWriteTrack(const matroska_block *Block) MATROSKA_DLL ebml_element *MATROSKA_BlockWriteSegmentInfo(const matroska_block *Block); #endif -MATROSKA_DLL err_t MATROSKA_BlockSkipToFrame(const matroska_block *Block, stream *Input, size_t FrameNum); +MATROSKA_DLL err_t MATROSKA_BlockSkipToFrame(const matroska_block *Block, struct stream *Input, size_t FrameNum); MATROSKA_DLL void MATROSKA_BlockSetKeyframe(matroska_block *Block, bool_t Set); MATROSKA_DLL void MATROSKA_BlockSetDiscardable(matroska_block *Block, bool_t Set); -MATROSKA_DLL err_t MATROSKA_BlockProcessFrameDurations(matroska_block *Block, stream *Input, int ForProfile); +MATROSKA_DLL err_t MATROSKA_BlockProcessFrameDurations(matroska_block *Block, struct stream *Input, int ForProfile); MATROSKA_DLL size_t MATROSKA_BlockGetFrameCount(const matroska_block *Block); MATROSKA_DLL mkv_timestamp_t MATROSKA_BlockGetFrameDuration(const matroska_block *Block, size_t FrameNum); MATROSKA_DLL mkv_timestamp_t MATROSKA_BlockGetFrameStart(const matroska_block *Block, size_t FrameNum); diff --git a/libmatroska2/matroskablock.c b/libmatroska2/matroskablock.c index 4b7ac1a9..8b5ce121 100644 --- a/libmatroska2/matroskablock.c +++ b/libmatroska2/matroskablock.c @@ -34,6 +34,8 @@ #include "misc.h" #endif +#include + static int A_MPEG_freq[4][4] = { // v2.5 * v2 v1 @@ -67,7 +69,7 @@ static const int A_DTS_freq[16] = { }; -err_t MATROSKA_BlockProcessFrameDurations(matroska_block *Block, stream *Input, int ForProfile) +err_t MATROSKA_BlockProcessFrameDurations(matroska_block *Block, struct stream *Input, int ForProfile) { ebml_master *Track=NULL; ebml_element *Elt; diff --git a/libmatroska2/matroskamain.c b/libmatroska2/matroskamain.c index f83ad711..e6b41626 100644 --- a/libmatroska2/matroskamain.c +++ b/libmatroska2/matroskamain.c @@ -37,6 +37,8 @@ #if defined(CONFIG_LZO1X) #include "minilzo.h" #endif +#include +#include extern const nodemeta Matroska_Class[]; @@ -977,7 +979,7 @@ err_t MATROSKA_BlockReleaseData(matroska_block *Block, bool_t IncludingNotRead) return ERR_NONE; } -err_t MATROSKA_BlockSkipToFrame(const matroska_block *Block, stream *Input, size_t FrameNum) +err_t MATROSKA_BlockSkipToFrame(const matroska_block *Block, struct stream *Input, size_t FrameNum) { uint32_t *i; filepos_t SeekPos = EBML_ElementPositionData((ebml_element*)Block); @@ -998,7 +1000,7 @@ err_t MATROSKA_BlockSkipToFrame(const matroska_block *Block, stream *Input, size // TODO: support zero copy reading (read the frames directly into a buffer with a callback per frame) // pass the Input stream and the amount to read per frame, give the timestamp of the frame and get the end timestamp in return, get an error code if reading failed -err_t MATROSKA_BlockReadData(matroska_block *Element, stream *Input, int ForProfile) +err_t MATROSKA_BlockReadData(matroska_block *Element, struct stream *Input, int ForProfile) { size_t Read,BufSize; size_t NumFrame; @@ -1392,7 +1394,7 @@ static err_t SetBlockGroupParent(ebml_master *Element, void* Parent, void* Befor return Result; } -static err_t ReadBigBinaryData(ebml_binary *Element, stream *Input, const ebml_parser_context *ParserContext, bool_t AllowDummyElt, int Scope, size_t DepthCheckCRC) +static err_t ReadBigBinaryData(ebml_binary *Element, struct stream *Input, const ebml_parser_context *ParserContext, bool_t AllowDummyElt, int Scope, size_t DepthCheckCRC) { if (Scope == SCOPE_PARTIAL_DATA) { @@ -1402,7 +1404,7 @@ static err_t ReadBigBinaryData(ebml_binary *Element, stream *Input, const ebml_p return INHERITED(Element,ebml_element_vmt,MATROSKA_BIGBINARY_CLASS)->ReadData(Element, Input, ParserContext, AllowDummyElt, Scope, DepthCheckCRC); } -static err_t ReadBlockData(matroska_block *Element, stream *Input, const ebml_parser_context *ParserContext, bool_t AllowDummyElt, int Scope) +static err_t ReadBlockData(matroska_block *Element, struct stream *Input, const ebml_parser_context *ParserContext, bool_t AllowDummyElt, int Scope) { err_t Result; uint8_t _TempHead[5]; @@ -1720,7 +1722,7 @@ static char GetBestLacingType(const matroska_block *Element, int ForProfile) return LACING_EBML; } -static err_t RenderBlockData(matroska_block *Element, stream *Output, bool_t bForceWithoutMandatory, bool_t bWithDefault, int ForProfile, filepos_t *Rendered) +static err_t RenderBlockData(matroska_block *Element, struct stream *Output, bool_t bForceWithoutMandatory, bool_t bWithDefault, int ForProfile, filepos_t *Rendered) { err_t Err = ERR_NONE; uint8_t BlockHead[5], *Cursor; @@ -2250,7 +2252,7 @@ static err_t CreateCluster(matroska_cluster *p) return ERR_NONE; } -static err_t ReadTrackEntry(matroska_trackentry *Element, stream *Input, const ebml_parser_context *ParserContext, bool_t AllowDummyElt, int Scope, size_t DepthCheckCRC) +static err_t ReadTrackEntry(matroska_trackentry *Element, struct stream *Input, const ebml_parser_context *ParserContext, bool_t AllowDummyElt, int Scope, size_t DepthCheckCRC) { Element->CodecPrivateCompressionAlgo = MATROSKA_TRACK_ENCODING_COMP_NONE; err_t Result = INHERITED(Element,ebml_element_vmt,MATROSKA_TRACKENTRY_CLASS)->ReadData(Element, Input, ParserContext, AllowDummyElt, Scope, DepthCheckCRC); diff --git a/libmatroska2/test/mkvtree.c b/libmatroska2/test/mkvtree.c index f6be469a..4b13af43 100644 --- a/libmatroska2/test/mkvtree.c +++ b/libmatroska2/test/mkvtree.c @@ -29,6 +29,9 @@ #include #include "matroska2/matroska.h" +#include +#include +#include static int ShowPos = 0; @@ -86,7 +89,11 @@ void DebugMessage(const tchar_t* Msg,...) va_end(Args); tcscat_s(Buffer,TSIZEOF(Buffer),T("\r\n")); +#ifdef UNICODE + fprintf(stderr, "%ls", Buffer); +#else fprintf(stderr, "%s", Buffer); +#endif } #endif @@ -98,7 +105,7 @@ static void EndLine(ebml_element *Element) fprintf(stdout,"\r\n"); } -static ebml_element *OutputElement(ebml_element *Element, const ebml_parser_context *Context, stream *Input, int *Level) +static ebml_element *OutputElement(ebml_element *Element, const ebml_parser_context *Context, struct stream *Input, int *Level) { int LevelPrint; for (LevelPrint=0;LevelPrint<*Level;++LevelPrint) @@ -256,7 +263,7 @@ static ebml_element *OutputElement(ebml_element *Element, const ebml_parser_cont return NULL; } -static void OutputTree(stream *Input) +static void OutputTree(struct stream *Input) { ebml_element *Element = EBML_ElementCreate(Input,MATROSKA_getContextStream(),0,PROFILE_MATROSKA_ANY); if (Element) @@ -271,7 +278,7 @@ static void OutputTree(stream *Input) int main(int argc, const char *argv[]) { parsercontext p; - stream *Input; + struct stream *Input; tchar_t Path[MAXPATHFULL]; if ((argc!=2 && argc!=3) || (argc==3 && strcmp(argv[1],"--pos"))) diff --git a/mkclean/mkclean.c b/mkclean/mkclean.c index 81054d72..caddd4fa 100644 --- a/mkclean/mkclean.c +++ b/mkclean/mkclean.c @@ -29,6 +29,10 @@ #include "matroska2/matroska.h" #include "matroska2/matroska_sem.h" #include "mkclean_project.h" +#include +#include +#include +#include #ifndef CONFIG_EBML_WRITING #error libebml2 was not built with writing support! @@ -112,7 +116,11 @@ void DebugMessage(const tchar_t* Msg,...) va_end(Args); tcscat_s(Buffer,TSIZEOF(Buffer),T("\r\n")); +#ifdef UNICODE + fprintf(stderr, "%ls", Buffer); +#else fprintf(stderr, "%s", Buffer); +#endif } #endif @@ -250,7 +258,7 @@ static void ReduceSize(ebml_element *Element) } } -static bool_t ReadClusterData(ebml_master *Cluster, stream *Input) +static bool_t ReadClusterData(ebml_master *Cluster, struct stream *Input) { bool_t Changed = 0; err_t Result = ERR_NONE; @@ -309,7 +317,7 @@ static err_t UnReadClusterData(ebml_master *Cluster, bool_t IncludingNotRead) return Result; } -static void SetClusterPrevSize(array *Clusters, stream *Input) +static void SetClusterPrevSize(array *Clusters, struct stream *Input) { ebml_master **Cluster; ebml_element *Elt, *Elt2; @@ -358,7 +366,7 @@ static void UpdateCues(ebml_master *Cues, ebml_master *Segment) } } -static void SettleClustersWithCues(array *Clusters, filepos_t ClusterStart, ebml_master *Cues, ebml_master *Segment, bool_t SafeClusters, stream *Input) +static void SettleClustersWithCues(array *Clusters, filepos_t ClusterStart, ebml_master *Cues, ebml_master *Segment, bool_t SafeClusters, struct stream *Input) { ebml_element *Elt, *Elt2; ebml_master **Cluster; @@ -537,7 +545,7 @@ static int LinkClusters(array *Clusters, ebml_master *RSegmentInfo, ebml_master return 0; } -static void OptimizeCues(ebml_master *Cues, array *Clusters, ebml_master *RSegmentInfo, filepos_t StartPos, ebml_master *WSegment, filepos_t TotalSize, bool_t ReLink, bool_t SafeClusters, stream *Input) +static void OptimizeCues(ebml_master *Cues, array *Clusters, ebml_master *RSegmentInfo, filepos_t StartPos, ebml_master *WSegment, filepos_t TotalSize, bool_t ReLink, bool_t SafeClusters, struct stream *Input) { matroska_cluster **Cluster; matroska_cuepoint *Cue; @@ -563,7 +571,7 @@ static void OptimizeCues(ebml_master *Cues, array *Clusters, ebml_master *RSegme SettleClustersWithCues(Clusters,StartPos,Cues,WSegment,SafeClusters, Input); } -static ebml_element *CheckMatroskaHead(const ebml_element *Head, const ebml_parser_context *Parser, stream *Input) +static ebml_element *CheckMatroskaHead(const ebml_element *Head, const ebml_parser_context *Parser, struct stream *Input) { ebml_parser_context SubContext; ebml_element *SubElement; @@ -663,7 +671,7 @@ static ebml_element *CheckMatroskaHead(const ebml_element *Head, const ebml_pars return NULL; } -static bool_t WriteCluster(ebml_master *Cluster, stream *Output, stream *Input, filepos_t PrevSize, mkv_timestamp_t *PrevTimestamp) +static bool_t WriteCluster(ebml_master *Cluster, struct stream *Output, struct stream *Input, filepos_t PrevSize, mkv_timestamp_t *PrevTimestamp) { filepos_t IntendedPosition = EBML_ElementPosition((ebml_element*)Cluster); ebml_element *Elt; @@ -1345,7 +1353,7 @@ static bool_t BlockIsCompressed(const matroska_block *Block) return 0; } -static void ShrinkCommonHeader(array *TrackHeader, matroska_block *Block, stream *Input) +static void ShrinkCommonHeader(array *TrackHeader, matroska_block *Block, struct stream *Input) { size_t Frame,FrameCount,EqualData; matroska_frame FrameData; @@ -1393,7 +1401,7 @@ static void ClearCommonHeader(array *TrackHeader) TrackHeader->_Begin = NULL; } -static void WriteJunk(stream *Output, size_t Amount) +static void WriteJunk(struct stream *Output, size_t Amount) { char Val = 0x0A; while (Amount--) @@ -1411,7 +1419,7 @@ int main(int argc, const char *argv[]) int ShowVersion = 0; parsercontext p; textwriter _StdErr; - stream *Input = NULL,*Output = NULL; + struct stream *Input = NULL,*Output = NULL; tchar_t Path[MAXPATHFULL]; tchar_t String[MAXLINE],Original[MAXLINE],*s; ebml_master *EbmlHead = NULL, *RSegment = NULL, *RLevel1 = NULL, **Cluster; @@ -1455,7 +1463,7 @@ int main(int argc, const char *argv[]) StdErr = &_StdErr; memset(StdErr,0,sizeof(_StdErr)); - StdErr->Stream = (stream*)NodeSingleton(&p,STDERR_ID); + StdErr->Stream = (struct stream*)NodeSingleton(&p,STDERR_ID); #if defined(TARGET_WIN) && defined(UNICODE) Node_FromWcs(&p,Path,TSIZEOF(Path),argv[0]); @@ -1512,7 +1520,7 @@ int main(int argc, const char *argv[]) #else Node_FromStr(&p,Path,TSIZEOF(Path),argv[++i]); #endif - TimestampScale = StringToInt(Path,0); + TimestampScale = StringToInt64(Path); InputPathIndex = i+1; } else if (tcsisame_ascii(Path,T("--alt-3d")) && i+1 +#include static textwriter *StdErr = NULL; static bool_t Split = 1; @@ -103,7 +105,11 @@ void DebugMessage(const tchar_t* Msg,...) va_end(Args); tcscat_s(Buffer,TSIZEOF(Buffer),T("\r\n")); +#ifdef UNICODE + fprintf(stderr, "%ls", Buffer); +#else fprintf(stderr, "%s", Buffer); +#endif } #endif @@ -136,7 +142,7 @@ typedef struct { filepos_t SegmentSize; } SegmentStart; -static void CopyTo(stream *Input, stream *Output, filepos_t StartPos, filepos_t Size) +static void CopyTo(struct stream *Input, struct stream *Output, filepos_t StartPos, filepos_t Size) { filepos_t SizeToCopy = Size; size_t readSize; @@ -163,7 +169,7 @@ int main(int argc, const char *argv[]) int ShowVersion = 0; parsercontext p; textwriter _StdErr; - stream *Input = NULL, *Output = NULL; + struct stream *Input = NULL, *Output = NULL; tchar_t Path[MAXPATHFULL]; ebml_element *EbmlHead = NULL; ebml_parser_context RContext; @@ -183,7 +189,7 @@ int main(int argc, const char *argv[]) StdErr = &_StdErr; memset(StdErr,0,sizeof(_StdErr)); - StdErr->Stream = (stream*)NodeSingleton(&p,STDERR_ID); + StdErr->Stream = (struct stream*)NodeSingleton(&p,STDERR_ID); assert(StdErr->Stream!=NULL); for (i=1;i +#include /*! * \todo verify the track timestamp scale is not null @@ -121,7 +123,11 @@ void DebugMessage(const tchar_t* Msg,...) va_end(Args); tcscat_s(Buffer,TSIZEOF(Buffer),T("\r\n")); +#ifdef UNICODE + fprintf(stderr, "%ls", Buffer); +#else fprintf(stderr, "%s", Buffer); +#endif } #endif @@ -877,7 +883,7 @@ int main(int argc, const char *argv[]) int ShowVersion = 0; parsercontext p; textwriter _StdErr; - stream *Input = NULL; + struct stream *Input = NULL; tchar_t Path[MAXPATHFULL]; tchar_t String[MAXLINE]; ebml_master *EbmlHead = NULL, *RSegment = NULL, *RLevel1 = NULL, *Prev, *RLevelX, **Cluster; @@ -906,7 +912,7 @@ int main(int argc, const char *argv[]) StdErr = &_StdErr; memset(StdErr,0,sizeof(_StdErr)); - StdErr->Stream = (stream*)NodeSingleton(&p,STDERR_ID); + StdErr->Stream = (struct stream*)NodeSingleton(&p,STDERR_ID); assert(StdErr->Stream!=NULL); for (i=1;i