void NodeAddModule(const tchar_t* Path,int Id,int64_t Date,bool_t Load,bool_t Tmp) { context* p = Context(); LockEnter(p->NodeLock); if (ArrayAppend(&p->NodeModule,NULL,sizeof(nodemodule),256)) { int No = ARRAYCOUNT(p->NodeModule,nodemodule)-1; nodemodule* Module = ARRAYBEGIN(p->NodeModule,nodemodule)+No; memset(Module,0,sizeof(nodemodule)); Module->Id = Id; Module->Date = Date; Module->Tmp = Tmp; StringAdd(1,MODULE_PATH,No,Path); if (Load) { p->LoadModuleNo = No; Module->Module = NodeLoadModule(Path,&Module->Id,&Module->Func,&Module->Db); p->LoadModuleNo = 0; #ifdef PLUGINCLEANUP FreeModule(Module); #endif } } LockLeave(p->NodeLock); }
static NOINLINE int FindModule(context* p,const tchar_t* Path,int Id) { // important to find from the begining for Palm OS // so the exising plugins are found first int No,Count; int Result = -1; LockEnter(p->NodeLock); Count = ARRAYCOUNT(p->NodeModule,nodemodule); if (!Path) Path = T(""); for (No=0;No<Count;++No) { bool_t SameId = ARRAYBEGIN(p->NodeModule,nodemodule)[No].Id == Id; bool_t SameName = TcsICmp(Path,StringDef(MODULE_PATH,No))==0; if (SameId && Id!=0) // same Id means same module SameName = 1; if (SameName && !Id) SameId = 1; if (SameId && SameName) { Result = No; break; } } LockLeave(p->NodeLock); return Result; }
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; }
static bool_t AllocBlockGroup(block* Block, bool_t Optional) { int n; blockgroup* g; for (g=ARRAYBEGIN(BlockGroup,blockgroup);g!=ARRAYEND(BlockGroup,blockgroup);++g) if (g->Mask && g->Mask != (1<<BLOCKGROUP)-1) break; if (g==ARRAYEND(BlockGroup,blockgroup)) { if (!Optional) return 0; for (g=ARRAYBEGIN(BlockGroup,blockgroup);g!=ARRAYEND(BlockGroup,blockgroup);++g) if (!g->Mask) break; if (g==ARRAYEND(BlockGroup,blockgroup)) { if (!ArrayAppend(&BlockGroup,NULL,sizeof(blockgroup),64)) return 0; g=ARRAYEND(BlockGroup,blockgroup)-1; g->Mask = 0; } if (!AllocBlock(BLOCKSIZE*BLOCKGROUP,&g->Block,1,HEAP_ANY)) return 0; } for (n=0;n<BLOCKGROUP;++n) if (!(g->Mask & (1<<n))) { g->Mask |= (1<<n); Block->Id = ((g-ARRAYBEGIN(BlockGroup,blockgroup))<<8)+(n+1); Block->Ptr = g->Block.Ptr + n*BLOCKSIZE; return 1; } return 0; }
void String_Done() { MemHandle *i; context* p = Context(); StringFree(); for (i=ARRAYBEGIN(p->StrModule,MemHandle);i!=ARRAYEND(p->StrModule,MemHandle);++i) { MemHandleUnlock(*i); DmReleaseResource(*i); } ArrayClear(&p->StrModule); }
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); }
static NOINLINE bool_t TmpModule(context* p,int No) { return ARRAYBEGIN(p->NodeModule,nodemodule)[No].Tmp; }