From: <sle...@us...> - 2006-12-02 00:25:37
|
Revision: 689 http://svn.sourceforge.net/hackndev/?rev=689&view=rev Author: sleep_walker Date: 2006-12-01 16:25:32 -0800 (Fri, 01 Dec 2006) Log Message: ----------- l4p: BFUGarux initial module selection support Modified Paths: -------------- linux4palm/BFUGarux/BFUDefaultSettings.h linux4palm/BFUGarux/BFUSettings-alone.c linux4palm/BFUGarux/BFUSettings.Rsrc linux4palm/BFUGarux/BFUSettings.Rsrc.h linux4palm/BFUGarux/garux-clean.c Modified: linux4palm/BFUGarux/BFUDefaultSettings.h =================================================================== --- linux4palm/BFUGarux/BFUDefaultSettings.h 2006-12-01 23:16:34 UTC (rev 688) +++ linux4palm/BFUGarux/BFUDefaultSettings.h 2006-12-02 00:25:32 UTC (rev 689) @@ -13,6 +13,7 @@ #define BFUDefaultFileNameOnCard "/BFUSavedSettings.pdb" #define BFUDefaultFileNameSize 256 +#define BFURowsInTable 6 #define BFUDefaultSource 0 #define BFUDefaultAddress "/linux2ram" Modified: linux4palm/BFUGarux/BFUSettings-alone.c =================================================================== --- linux4palm/BFUGarux/BFUSettings-alone.c 2006-12-01 23:16:34 UTC (rev 688) +++ linux4palm/BFUGarux/BFUSettings-alone.c 2006-12-02 00:25:32 UTC (rev 689) @@ -1,4 +1,11 @@ //#define BFU_VERBOSE +#define MODULES_DEBUG +#define MODULES_VERBOSE_DEBUG + +// #define BFUContentsTest +#define BFUSaveContentsTest + + #include "BFUDefaultSettings.h" #include "BFUSettings.Rsrc.h" @@ -24,6 +31,7 @@ UInt8 mask[4]; //modules UInt32 modules; + UInt8 modlist; //advanced settings UInt8 debug; UInt8 silentBoot; @@ -34,7 +42,6 @@ UInt8 fsck; UInt8 copy2ram; Char RAMdiskSize[BFURAMdiskMaxLength]; - UInt8 save2card; } BFUSettingsType; @@ -66,6 +73,19 @@ static Boolean BFUToolsFormEventHandler (EventPtr pEvent); static Boolean BFUAdvancedFormEventHandler (EventPtr pEvent); static void BFUSetFieldText(FormType *pForm,UInt32 index,Char *new_text,UInt32 MaxLength); +//from modules.c +static Boolean BFUReadFileNames(UInt16 volRefNum); +static Boolean BFUInitFileLists(); +void BFUdoDie(const Char * ErrStr,Err error); +static Boolean BFUPush2ModList(const Char *name); +static Boolean BFUIsModList(const Char *name); +static Boolean BFUReadModLists(UInt16 volRefNum); +static Boolean BFUInitModList(); +Int16 BFUCompare(void **v1,void **v2,Int32 other); +static Boolean BFUInitTable(); +static void BFUSetTableFromBar(Int16 val); +static Boolean BFUSaveNames(); +static Boolean BFUInitModList(); Char BFUCommandLinePart[BFUCommandLinePartLength]; @@ -78,7 +98,16 @@ UInt16 cardNo; //UInt32 volIterator; UInt16 BFUPrefsVolRefNum; +//from modules.c +MemHandle listHandle, modListHandle,modPtrHandle; +MemHandle ptrHandle,saveHandle; +UInt8 size,msize,modCount; +UInt32 mlength,length; +Boolean UseSclBar,CardIn; + + + static Boolean BFUCopySettingsStruct(BFUSettingsType *source,BFUSettingsType *dest) { UInt8 i; @@ -111,6 +140,8 @@ dest->reflash = source->reflash; dest->copy2ram = source->copy2ram; dest->fsck = source->fsck; + dest->modules = source->modules; + dest->modlist = source->modlist; return true; } @@ -173,7 +204,6 @@ options |= BFUSettingsValues.fs; options = options << 2; options |= BFUSettingsValues.source; - // BFUPrintHex(options,optstr); // StrPrintF(optstr,"%x",options); // BFUdoDie(optstr,options); @@ -291,6 +321,9 @@ StrCat(BFUCommandLinePart,BFUSettingsValues.RAMdiskSize); // BFUdoDie(BFUCommandLinePart,0); StrCat(BFUCommandLinePart,del); +//Modules selection + StrPrintF(netSet,"%x",BFUSettingsValues.modules); + BFUdoDie(netSet,0); #ifdef BFU_VERBOSE BFUdoDie(BFUCommandLinePart,0); #endif @@ -336,7 +369,9 @@ BFUSettingsValues.save2card = BFUDefaultSave2Card; BFUSettingsValues.reflash = BFUDefaultReflash; BFUSettingsValues.copy2ram = BFUDefaultCopy2RAM; - BFUSettingsValues.fsck = 0; + BFUSettingsValues.fsck = BFUDefaultFSCK; + BFUSettingsValues.modules = 0; + BFUSettingsValues.modlist = 0; } @@ -855,7 +890,11 @@ Boolean BFUModulesFormEventHandler(EventPtr pEvent) { Boolean handled = false; + Int16 row,val; + TableType *tab; + ScrollBarType *bar; FormPtr pForm = FrmGetActiveForm(); + switch (pEvent->eType) { case frmOpenEvent: // Form's 1st event @@ -888,6 +927,59 @@ break; } break; + case tblEnterEvent: + tab=getObjectPtr(pForm,BFUModulesTable); + row = pEvent->data.tblEnter.row; + val=TblGetItemInt(tab,row,1); + val = (val+1)%2; + TblSetItemInt(tab,row,1,val); + TblSetSelection(tab,row,0); + TblMarkRowInvalid(tab,row); + TblRedrawTable(tab); + break; + case sclRepeatEvent: +// BFUSaveNames(); + tab=getObjectPtr(pForm,BFUModulesTable); + bar = pEvent->data.sclRepeat.pScrollBar; + val = pEvent->data.sclRepeat.newValue; + if (UseSclBar) + { + BFUSetTableFromBar(val); + SclSetScrollBar(bar,val, 0,(UInt16)(size-BFURowsInTable), 1); + SclDrawScrollBar(bar); + } + break; + case keyDownEvent: + if (UseSclBar) + switch(pEvent->data.keyDown.chr) + { + case 11://up + bar=getObjectPtr(pForm,BFUModScrollBar); + SclGetScrollBar(bar,&val,0,0,0); + if (val) + { + --val; + BFUSetTableFromBar(val); + SclSetScrollBar(bar,val, 0, + (UInt16)(size-BFURowsInTable), 1); + SclDrawScrollBar(bar); + } + break; + case 12://down + bar=getObjectPtr(pForm,BFUModScrollBar); + SclGetScrollBar(bar,&val,0,0,0); + if (val<size-BFURowsInTable) + { + ++val; + BFUSetTableFromBar(val); + SclSetScrollBar(bar,val, 0, + (UInt16)(size-BFURowsInTable), 1); + SclDrawScrollBar(bar); + } + + break; + } + break; case popSelectEvent: switch(pEvent->data.popSelect.controlID) { @@ -1132,6 +1224,11 @@ static void BFUModulesFormInit (FormPtr pForm) { CtlSetValue(getObjectPtr(pForm,BFUSave2CardBox),BFUSettingsValues.save2card); + if ((CardIn = BFUInitFileLists())) + BFUInitTable(); + else + BFUdoDie("No card or error occured.",0); + BFUInitModList(); } static void BFUToolsFormInit (FormPtr pForm) @@ -1167,6 +1264,8 @@ static void BFUOKButtonPressed() { BFUPrefs2String(); + if (saveHandle) + MemHandleFree(saveHandle); // FrmCustomAlert(BFUAlert,"Output string:\n",BFUCommandLinePart,NULL); FrmGotoForm(1000); } @@ -1182,6 +1281,8 @@ static void BFUCancelButtonPressed() { *BFUCommandLinePart = '\0'; + if (saveHandle) + MemHandleFree(saveHandle); FrmGotoForm(1000); } @@ -1217,7 +1318,37 @@ static void BFUModulesFormSaveFields(FormType *pForm) -{ +{ + BFUSaveNames(); + BFUdoDie("Removing listHandle",0); + if (listHandle) + { +#ifdef MODULES_VERBOSE_DEBUG + BFUdoDie("Unlock listHandle",0); +#endif + MemHandleUnlock(listHandle); + MemHandleFree(listHandle); + listHandle = 0; + } + BFUdoDie("Removing ptrHandle",0); + if (ptrHandle) + { + MemHandleFree(ptrHandle); + ptrHandle = 0; + } + BFUdoDie("Removing modListHandle",0); + if (modListHandle) + { + MemHandleFree(modListHandle); + modListHandle = 0; + } + BFUdoDie("Removing modPtrHandle",0); + if (modPtrHandle) + { + MemHandleFree(modPtrHandle); + modPtrHandle = 0; + } + return; } static void BFUToolsFormSaveFields(FormType *pForm) @@ -1229,3 +1360,484 @@ StrNCopy(BFUSettingsValues.RAMdiskSize, FldGetTextPtr(getObjectPtr(pForm,BFURAMdiskSizeField)),BFURAMdiskMaxLength); } + +static Boolean BFUPush2List(const Char *name) +{ + Char *ptr; + Err err; + +#ifdef MODULES_VERBOSE_DEBUG + BFUdoDie("Entering BFUPush2List()",0); +#endif + + if (size) + { + ++size; + err = MemHandleResize(listHandle,size*BFUDefaultFileNameSize); + switch (err) + { + case 0: + //OK + break; + default: + BFUdoDie("Cannot resize modListHandle! That's fatal error for this form",0); + return false; + } + } + else + { + size=1; + listHandle=MemHandleNew(BFUDefaultFileNameSize); + } + ptr = MemHandleLock(listHandle); + StrNCopy(ptr+length,name, BFUDefaultFileNameSize); + length += StrLen(name)+1; + MemHandleUnlock(listHandle); +#ifdef MODULES_VERBOSE_DEBUG + BFUdoDie("Leaving BFUPush2List()",0); +#endif + return true; +} + +static Boolean BFUIsSquashFS(const Char *name) +{ + UInt8 l; + if ((l=StrLen(name))>9) + { + if (!StrCaselessCompare(".squashfs",name+l-9)) + return true; + } + return false; +} + + +static Boolean BFUReadFileNames(UInt16 volRefNum) +{ + FileInfoType info; + FileRef dirRef; + UInt32 dirIterator; + Boolean result = true; + Char *fileName = MemPtrNew(256); + Char *ptr, **pptr; +// FormPtr pForm=FrmGetActiveForm(); + Err err; + + +#ifdef BFUContentsTest + UInt32 i; +#endif + + + size = 0; + msize=1; + listHandle = 0; + ptrHandle = 0; + modPtrHandle = 0; + modListHandle = 0; + + if (!fileName) + { + BFUdoDie("Couldn't allocate memory for fileName buffer",0); + return false; + } + + modListHandle = MemHandleNew(BFUDefaultFileNameSize); + if (!modListHandle) + { + BFUdoDie("Couldn't allocate memory for modListHandle",0); + return false; + } + ptr = MemHandleLock(modListHandle); + StrCopy(ptr,"Custom"); + ptr[6]='\0'; + mlength=7;//"Custom" + MemHandleUnlock(modListHandle); + + +#ifdef MODULES_DEBUG + BFUdoDie("Entering BFUReadFileNames()",0); +#endif + + err = VFSFileOpen(volRefNum,"/"/* "linux2ram"*/,vfsModeRead,&dirRef); + switch(err) + { + case errNone: + info.nameP = fileName; + info.nameBufLen = 256; + dirIterator = vfsIteratorStart; + while (dirIterator != vfsIteratorStop) + { + err = VFSDirEntryEnumerate (dirRef, &dirIterator,&info); + if (err == errNone) + { + if (BFUIsSquashFS(fileName)) + { + BFUPush2List(fileName); + } + else + if (BFUIsModList(fileName)) + { + BFUPush2ModList(fileName); + } + + } + else + { + dirIterator = vfsIteratorStop; + result = false; + } + } + } + if (result) + { +//sort names here + if (size) + { + ptr = MemHandleLock(listHandle); + if (!ptr) + { + BFUdoDie("Couldn't lock listHandle",0); + return false; + } + ptrHandle = SysFormPointerArrayToStrings(ptr,size); + if (!ptrHandle) + { + BFUdoDie("ptrHandle error",0); + return false; + } + pptr = MemHandleLock(ptrHandle); + if (size > 1) + SysQSort(pptr, size, sizeof(Char *),(CmpFuncPtr)&BFUCompare,0); + +#ifdef BFUContentsTest + for (i = 0; i < size ; ++i) + { + BFUdoDie(pptr[i],0); + } +#endif +// MemHandleUnlock(listHandle); + MemHandleUnlock(ptrHandle); + } + + ptr = MemHandleLock(modListHandle); + if (!ptr) + { + BFUdoDie("Couldn't lock modListHandle error",0); + return false; + } + + modPtrHandle = SysFormPointerArrayToStrings(ptr,msize); + if (!modPtrHandle) + { + BFUdoDie("modPtrHandle error",0); + return false; + } + pptr = MemHandleLock(modPtrHandle); + if (!modPtrHandle) + { + BFUdoDie("Couldn't lock modPtrHandle",0); + return false; + } + if (size > 1) + SysQSort(pptr, msize, sizeof(Char *), (CmpFuncPtr)(&BFUCompare),0); + +#ifdef BFUContentsTest + for (i = 0; i < msize ; ++i) + { + BFUdoDie(pptr[i],0); + } +#endif + } + MemPtrFree(fileName); + VFSFileClose(dirRef); + return true; +} + +static Boolean BFUInitFileLists() +{ + UInt16 volRefNum; + UInt32 vfsIterator=vfsIteratorStart; + Err err; + Boolean result=false; + +#ifdef MODULES_DEBUG + BFUdoDie("Entering BFUInitFileList()",0); +#endif + + while(vfsIterator != vfsIteratorStop) + { + err = VFSVolumeEnumerate(&volRefNum,&vfsIterator); + switch (err) + { + case errNone: + if ((result=BFUReadFileNames(volRefNum))) + vfsIterator = vfsIteratorStop; + break; + default: + vfsIterator = vfsIteratorStop; + break; + } + } +#ifdef MODULES_DEBUG + BFUdoDie("Leaving BFUInitFileList()",0); +#endif + return result; +} + +static Boolean BFUInitTable() +{ + int i; + Char **ptr; + TableType *table = getObjectPtr(FrmGetActiveForm(),BFUModulesTable); + Int16 numRow = size; + FormPtr pForm = FrmGetActiveForm(); + +#ifdef MODULES_DEBUG + BFUdoDie("Entering BFUInitTable()",0); +#endif + + if (ptrHandle) + ptr = MemHandleLock(ptrHandle); + else + { + BFUdoDie("ptrHandle not allocated,shouldn't happen",0); + return false; + } + for (i=0; i < numRow; ++i) + { + TblSetItemStyle(table,i,1,checkboxTableItem); + TblSetItemInt(table,i,1,0); + TblSetItemStyle(table,i,0,labelTableItem); + TblSetItemPtr(table,i,0,ptr[i]); + TblSetRowUsable(table,i,true); + TblSetRowSelectable(table,i,true); + TblSetRowStaticHeight(table,i,true); + TblSetRowHeight(table,i,15); + } + TblMarkTableInvalid(table); + TblSetColumnSpacing(table,0,7); + TblSetColumnSpacing(table,1,20); + TblSetColumnUsable(table,0,true); + TblSetColumnUsable(table,1,true); + TblHasScrollBar(table,true); + if ((UseSclBar = size>BFURowsInTable)) + { + SclSetScrollBar(getObjectPtr(pForm, + BFUModScrollBar), 0,0, (UInt16)(size-BFURowsInTable),1); +// FrmShowObject(pForm,BFUModScrollBar); + } +#ifdef MODULES_VERBOSE_DEBUG + BFUdoDie("Going to set",0); +#endif + if (UseSclBar) + BFUSetTableFromBar(0); +#ifdef MODULES_DEBUG + BFUdoDie("leaving BFUInitTable()",0); +#endif + return true; +} + +static void BFUSetTableFromBar(Int16 val) +{ + Int16 i; + TableType *tab=getObjectPtr(FrmGetActiveForm(),BFUModulesTable); + +#ifdef MODULES_DEBUG + BFUdoDie("Entering BFUSetTableFromBar()",0); +#endif + + for (i = 0 ; i < size ; ++i) + { + TblSetRowMasked(tab,i,((i>=val)&&(i<val+BFURowsInTable))); + TblSetRowUsable(tab,i,((i>=val)&&(i<val+BFURowsInTable))); + TblMarkRowInvalid(tab,i); + } + TblMarkTableInvalid(tab); + TblRedrawTable(tab); +#ifdef MODULES_DEBUG + BFUdoDie("leaving BFUSetTableFromBar()",0); +#endif +} + +static Boolean BFUPush2ModList(const Char *name) +{ + Char *ptr; + Err err; + +#ifdef MODULES_VERBOSE_DEBUG + BFUdoDie("Entering BFUPush2ModList()",0); +#endif + + if (msize) + { + ++msize; + err = MemHandleResize(modListHandle,msize*BFUDefaultFileNameSize); + switch (err) + { + case 0: + //OK + break; + default: + BFUdoDie("Cannot resize modListHandle! That's fatal error for this form",0); + return false; + } + } + else + { + msize=1; + modListHandle=MemHandleNew(BFUDefaultFileNameSize); + } + ptr = MemHandleLock(modListHandle); + StrNCopy(ptr+mlength,name, BFUDefaultFileNameSize); + mlength += StrLen(name)+1; + MemHandleUnlock(modListHandle); +#ifdef MODULES_VERBOSE_DEBUG + BFUdoDie("leaving BFUPush2ModList()",0); +#endif + return true; +} + + + +static Boolean BFUIsModList(const Char *name) +{ + Char mod[8];//length of "modlist" + UInt8 l; +#ifdef MODULES_VERBOSE_DEBUG + BFUdoDie("entering BFUIsModList()",0); +#endif + if ((l=StrLen(name))>11) + { + StrNCopy(mod,name,7); //copy "modlist" from beginning + mod[7]='\0'; + if (!StrCaselessCompare(".txt",name+l-4) && !StrCaselessCompare("modlist",mod)) + return true; + } + return false; +#ifdef MODULES_VERBOSE_DEBUG + BFUdoDie("leaving BFUIsModList()",0); +#endif +} + + + +Int16 BFUCompare(void **v1,void **v2,Int32 other) +{ + return StrNCaselessCompare((Char *)*v1,(Char *)*v2,BFUDefaultFileNameSize); +} + +static Boolean BFUSaveNames() +{ + Int16 i; + UInt32 len=0,slen; + UInt32 bitmap=0; + Char **pptr,*sptr; + MemHandle ptrs; + TableType *tab=getObjectPtr(FrmGetActiveForm(),BFUModulesTable); + Err err; +#ifdef MODULES_DEBUG + BFUdoDie("entered BFUSaveNames()",0); +#endif + + if (saveHandle) + { + MemHandleFree(saveHandle); + saveHandle = 0; + } + modCount = 0; + if (size) + { + saveHandle = MemHandleNew(BFUDefaultFileNameSize); + if (!saveHandle) + { + BFUdoDie("Couldn't create new handle. Can't save.",0); + return false; + } + pptr = MemHandleLock(ptrHandle); + if (!pptr) + { + BFUdoDie("Couldn't lock new handle. Can't save.",0); + return false; + } + for (i = 0; i < size ; ++i) + { + if (TblGetItemInt(tab,i,1)) + { + ++modCount; + bitmap |=1; + slen = StrLen(pptr[i]); + err=MemHandleResize(saveHandle,len+slen+1); + if (err) + { + BFUdoDie("Couldn't resize new handle. Can't save.",0); + return false; + } + sptr=MemHandleLock(saveHandle); + if (!sptr) + { + BFUdoDie("Couldn't lock resized handle. Can't save.",0); + return false; + } + BFUdoDie(pptr[i],0); + StrNCopy(sptr+len,pptr[i],slen); + len+=slen+1; + sptr[len-1]='\0'; + MemHandleUnlock(saveHandle); + } + bitmap <<=1; + } + bitmap >>=1; +// BFUdoDie("Bitmap",bitmap); +#ifdef BFUSaveContentsTest + sptr=MemHandleLock(saveHandle); + ptrs = SysFormPointerArrayToStrings(sptr,size); + if (!ptrs) + { + BFUdoDie("ptrs error",0); + return false; + } + pptr = MemHandleLock(ptrs); + if (!pptr) + { + BFUdoDie("Couldn't lock ptrs. Can't save.",0); + return false; + } + for (i = 0; i < modCount ; ++i) + { + BFUdoDie(pptr[i],0); + } +#ifdef MODULES_VERBOSE_DEBUG + BFUdoDie("Unlock saveHandle",0); +#endif + MemHandleUnlock(saveHandle); +#ifdef MODULES_VERBOSE_DEBUG + BFUdoDie("Unlock ptrs",0); +#endif + MemHandleUnlock(ptrs); + MemHandleFree(ptrs); + ptrs = 0; +#endif +#ifdef MODULES_VERBOSE_DEBUG + BFUdoDie("Unlock ptrHandle",0); +#endif + MemHandleUnlock(ptrHandle); +#ifdef MODULES_DEBUG + BFUdoDie("leaving BFUSaveNames()",0); +#endif + } + return true; +} + +static Boolean BFUInitModList() +{ + FormPtr pForm=FrmGetActiveForm(); + Char **pptr = MemHandleLock(modPtrHandle); + + LstNewList ((void **)&pForm, BFUModList, 72, 29,85, 44,stdFont, 4,BFUModListTrigger); + LstSetListChoices(getObjectPtr(pForm,BFUModList),pptr,msize); + MemHandleUnlock(modListHandle); + MemHandleUnlock(modPtrHandle); + MemHandleUnlock(modPtrHandle); + return true; +} + Modified: linux4palm/BFUGarux/BFUSettings.Rsrc =================================================================== --- linux4palm/BFUGarux/BFUSettings.Rsrc 2006-12-01 23:16:34 UTC (rev 688) +++ linux4palm/BFUGarux/BFUSettings.Rsrc 2006-12-02 00:25:32 UTC (rev 689) @@ -81,7 +81,10 @@ POPUPLIST ID BFUPartTrigger BFUPartList LABEL "Set:" ID 8035 AT (9 16) USABLE FONT 1 CHECKBOX "To card" ID BFUSave2CardBox AT (74 140 47 15) USABLE LEFTANCHOR GROUP 0 - TABLE ID BFUModuleTable AT (9 31 141 100) ROWS 8 COLUMNS 2 COLUMNWIDTHS 120 8 + TABLE ID BFUModulesTable AT (2 39 157 97) ROWS 8 COLUMNS 2 COLUMNWIDTHS 120 8 + LABEL "Modules list:" ID 8210 AT (9 31) USABLE FONT 1 + POPUPTRIGGER "Custom" ID BFUModListTrigger AT (72 29 47 15) USABLE LEFTANCHOR + SCROLLBAR ID BFUModScrollBar AT (150 46 7 85) USABLE VALUE 0 MIN 0 MAX 0 PAGESIZE 1 END FORM ID BFUToolsForm AT (0 0 160 160) Modified: linux4palm/BFUGarux/BFUSettings.Rsrc.h =================================================================== --- linux4palm/BFUGarux/BFUSettings.Rsrc.h 2006-12-01 23:16:34 UTC (rev 688) +++ linux4palm/BFUGarux/BFUSettings.Rsrc.h 2006-12-02 00:25:32 UTC (rev 689) @@ -7,8 +7,12 @@ #define BFUSave2CardBox 8543 #define BFUModulesForm 8200 //"BFUSettings - Modules" -#define BFUModuleTable 8201 +#define BFUModulesTable 8201 +#define BFUModListTrigger 8202 +#define BFUModScrollBar 8203 +#define BFUModList 8205 + #define BFUToolsForm 8300 //"BFUSettings - Tools" #define BFUSilentBootBox 8301 #define BFUKeyboardSupportBox 8303 Modified: linux4palm/BFUGarux/garux-clean.c =================================================================== --- linux4palm/BFUGarux/garux-clean.c 2006-12-01 23:16:34 UTC (rev 688) +++ linux4palm/BFUGarux/garux-clean.c 2006-12-02 00:25:32 UTC (rev 689) @@ -82,7 +82,14 @@ StrNCopy(parameters,KernelDefaultParam,KernelParamLength+1); return; } -static void stopApp() {return;} +static void stopApp() +{ +#ifdef with_BFUSettings + if (saveHandle) + MemHandleFree(saveHandle); +#endif + return; +} static void BFUdoDie(const Char * ErrStr,Err error) { This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |