#include <pro_ext.h> char FAR *NullTerminate(Value FAR *cVal) { char *RetVal; if (!_SetHandSize(cVal->ev_handle, cVal->ev_length + 1)) { _Error(182); // "Insufficient memory" } ((char FAR *) _HandToPtr(cVal->ev_handle))[cVal->ev_length] = '\0'; RetVal = (char FAR *) _HandToPtr(cVal->ev_handle); return RetVal; } void FAR Str2Array(ParamBlk FAR *parm) { Value val; char FAR *InString = NullTerminate(&parm->p[0].val); char FAR *ArrayName = NullTerminate(&parm->p[1].val); int Slen = _StrLen(InString); Locator loc; NTI nti; if ( (nti = _NameTableIndex(ArrayName)) != -1 ) { if ( _FindVar(nti, -1, &loc) ) // If exists - release _Release(nti); } loc.l_subs = 1; loc.l_sub1 = Slen; loc.l_sub2 = 0; _NewVar(ArrayName,&loc,NV_PUBLIC); // Create one dimension public array val.ev_type = 'C'; val.ev_length = 1; val.ev_handle = _AllocHand(2); char FAR *rep = (char * ) _HandToPtr(val.ev_handle); _HLock(val.ev_handle); int i=0; while(InString[i] != '\0') { loc.l_sub1 = i+1; // Set next array elem - FP arrays start at 1 rep[0] = InString[i++] ; // Get current char rep[1] = '\0'; // null terminate _Store(&loc, &val); // Store to array elem } _HUnLock(val.ev_handle); _FreeHand(val.ev_handle); _RetInt(Slen,10); // return array len - string length } FoxInfo myFoxInfo[] = { {"ASTRING", (FPFI) Str2Array, 2, "CC"}, }; extern "C" { FoxTable _FoxTable = { (FoxTable *) 0, sizeof(myFoxInfo)/sizeof(FoxInfo), myFoxInfo }; }Sample usage from foxpro :
set library to str2arr.fll lnLen1 = str2arr('This is string1.','aTest1') lnLen2 = str2arr('This is string2. Up to 65000 chars could be used.','aTest2') disp memo like aTest1 disp memo like aTest2"Chapter 28: Accessing the Visual FoxPro API" in online help details how you'd build the FLL.