MBC/mbc4.cc

20629 lines
602 KiB
C++
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

// *********************************************************************
// Created with MBC (V) 4.0-Beta4 (2022/07/26)Ported to OSX by Armando Rivera
// Ported from BCX32 BASIC To C/C++ Translator (V) 5.12
// BCX (c) 1999 - 2018 by Kevin Diggins
// LinuxBC (c) 2009 by Mike Henning
// MBC (c) 2009 - 2018 by Armando Rivera
// *********************************************************************
// Translated for compiling with the g++ Compiler
// g++ -Wformat -D_FORTIFY_SOURCE=2 -Wno-write-strings $FILE$.cc -ldl -o $FILE$
// *********************************************************************
#include <stdbool.h>
#include <ctype.h>
#include <math.h>
#include <stdio.h>
#include <iostream>
#include <fstream>
#include <string.h>
#include <stddef.h>
#include <stdlib.h>
#include <setjmp.h>
#include <time.h>
#include <stdarg.h>
#include <dirent.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <sys/wait.h>
#include <unistd.h>
#include <dlfcn.h>
// ***************************************************
// Compiler Defines
// ***************************************************
#define C_EXPORT extern "C"
#define C_IMPORT extern "C"
#ifndef stat
#define lstat stat
#endif
#ifndef _fcloseall
#define _fcloseall _fcloseall
#endif
#ifndef HWND
#define HWND GHWND
#endif
#ifndef MAX_PATH
#define MAX_PATH 2048
#endif
#ifndef CALLBACK
#define CALLBACK
#endif
typedef unsigned int HINSTANCE;
typedef void* LPVOID;
typedef char* PCHAR;
typedef unsigned char BYTE;
typedef unsigned int UINT;
typedef unsigned char UCHAR;
typedef unsigned char* PUCHAR;
typedef unsigned long ULONG;
typedef unsigned long* ULONG_PTR;
typedef unsigned long DWORD;
#ifndef TRUE
#define TRUE 1
#endif
#ifndef FALSE
#define FALSE 0
#endif
#define BOOL bool
// ***************************************************
typedef long (*CPP_FARPROC)(char *);
// *************************************************
// User Defined Constants
// *************************************************
#define Version "4.0-Beta4 (2022/07/26)"
#define __BCX__ 1
#define vt_VarMin 2
#define vt_VarMax vt_VARIANT
#define fprintf ReDirectFPrint
#define MaxElements 128
#define MaxTypes 512
#define MaxLocalVars 512
#define MaxGlobalVars 4096
#define MaxLib 64
#define c_SglQt 39
#define c_DblQt 34
#define c_LPar 40
#define c_RPar 41
#define c_Komma 44
#define c_LtBkt 91
#define c_RtBkt 93
#define BCX_STR_RUNTIME "Runtime Functions"
#define BCX_STR_MAIN_PROG "Main Program"
#define BCX_STR_SYS_VARS "System Variables"
#define BCX_STR_STD_MACROS "Standard Macros"
#define BCX_STR_STD_PROTOS "Standard Prototypes"
#define BCX_STR_USR_PROCS "User Subs and Functions"
#define BCX_STR_USR_VARS "User Global Variables"
#define BCX_STR_USR_PROTOS "User Prototypes"
#define BCX_STR_USR_CONST "User Defined Constants"
#define BCX_STR_USR_TYPES "User Defined Types, Classes (CPP Mode), And Unions"
#define FUNCTIONPARSE_CLASS struct _FUNCTIONPARSE*
#define VarTypes "%$#!@¦"
#define ARGTYPE_CLASS struct _ARGTYPE*
#define PROTOSTORE_CLASS struct _PROTOSTORE*
#define ELEMENT_CLASS struct _ELEMENT*
#define USERTYPEDEFS_CLASS struct _USERTYPEDEFS*
#define VARINFO_CLASS struct _VARINFO*
#define VARCODE_CLASS struct _VARCODE*
#define iMatchLft(A,B) iMatch (A ,B ,0)
#define iMatchWrd(A,B) iMatch (A ,B ,1)
#define iMatchRgt(A,B) iMatch (A ,B ,2)
// *************************************************
// User's GLOBAL ENUM blocks
// *************************************************
enum
{
vt_UNKNOWN,
vt_STRLIT,
vt_INTEGER,
vt_SINGLE,
vt_DOUBLE,
vt_LDOUBLE,
VT_LLONG,
vt_STRVAR,
vt_DECFUNC,
vt_NUMBER,
vt_FILEPTR,
vt_UDT,
vt_STRUCT,
vt_UNION,
vt_BOOL,
vt_CHAR,
vt_LPSTRPTR,
vt_PCHAR,
vt_CHARPTR,
vt_VOID,
vt_LONG,
vt_DWORD,
vt_FARPROC,
vt_LPBYTE,
vt_LRESULT,
vt_BYTE,
vt_SHORT,
vt_USHORT,
vt_UINT,
vt_ULONG,
vt_HWND,
vt_HDC,
vt_COLORREF,
vt_HANDLE,
vt_HINSTANCE,
vt_WNDCLASSEX,
vt_HFONT,
vt_VARIANT
};
enum
{
mt_ProcessSetCommand,
mt_FuncSubDecC_Dec,
mt_FuncSubDecC_Dec2,
mt_Opts,
mt_Opts2,
mt_Opts3,
mt_OverLoad,
mt_OverLoad2,
mt_FuncSubx1,
mt_FuncSubx2
};
// *************************************************
// User Defined Types, Classes (CPP Mode), And Unions
// *************************************************
typedef struct _functionParse
{
int NumArgs;
int CommaPos[128];
}functionParse, *LPFUNCTIONPARSE;
typedef struct _ARGTYPE
{
char Arg[2048];
int ArgType;
}ARGTYPE, *LPARGTYPE;
typedef struct _ProtoStore
{
char Prototype[2048];
char Condition[512];
int CondLevel;
}ProtoStore, *LPPROTOSTORE;
typedef struct _Element
{
int ElementType;
int ElementID;
int ElementDynaPtr;
char ElementName[64];
}Element, *LPELEMENT;
typedef struct _UserTypeDefs
{
int TypeofDef;
int EleCnt;
struct _Element Elements[MaxElements];
char VarName[64];
}UserTypeDefs, *LPUSERTYPEDEFS;
typedef struct _VarInfo
{
int VarLine;
int VarType;
int VarDef;
int VarPntr;
int VarSF;
int VarExtn;
int VarCondLevel;
int VarEmitFlag;
int VarConstant;
char VarName[64];
char VarDim[128];
char VarModule[300];
char VarCondDef[128];
}VarInfo, *LPVARINFO;
typedef struct _VARCODE
{
int VarNo;
int Method;
int IsPtrFlag;
char Header[2048];
char Proto[2048];
char Functype[2048];
char StaticOut[2048];
char Token[2048];
char AsToken[2048];
}VARCODE, *LPVARCODE;
// *************************************************
// System Variables
// *************************************************
char TAB [2]={9,0}; // Horz Tab
char LF [2]={10,0}; // Line Feed
char ESC [2]={27,0}; // Escape
char SPC [2]={32,0}; // Space
char DQ [2]={34,0}; // Double-Quote
char DDQ [3]={34,34,0}; // Double-Double-Quote
char CRLF[3]={13,10,0}; // Carr Rtn & Line Feed
char *AR_fgets_retval;
// *************************************************
// User Global Variables
// *************************************************
static PCHAR *G_argv;
static int G_argc;
static int NoRT;
static int ByrefCnt;
static char CurLine[65535];
static int gLinesWritten;
static int LoopLocalCnt;
static int GlobalVarCnt;
static int TypeDefsCnt;
static int LocalVarCnt;
static int LocalDynArrCount;
static int LocalDynaCnt;
static int GlobalDynaCnt;
static int ModuleNdx;
static int FPtrNdx;
static int SplitCnt;
static int SplitCur;
static char SrcTmp[65535];
static int StartNdx;
static int ExitNdx;
static VARCODE VarCode;
static int UmQt;
static char LD_FLAGS[65535];
static char Accelerator[65535];
static char CallType[65535];
static int CaseFlag;
static char CaseVar[65535];
static char Cmd[65535];
static char Compiler[65535];
static char CmdLineConst[65535];
static char CmdLineFileOut[65535];
static int CurrentFuncType;
static char DimType[65535];
static int DllCnt;
static int LoadLibsCnt;
static float Elapsed;
static int EndOfProgram;
static int EntryCnt;
static int ErrFile;
static char szFile[65535];
static char Filnam[65535];
static int ForceMainToFunc;
static char Funcname[65535];
static char Handl[65535];
static int HFileCnt;
static char HFile[65535];
static int InConditional;
static char InIfDef[65535];
static int Indent;
static int InFunc;
static int InMain;
static int IsCallBack;
static int TurboSize;
static int UseCProto;
static int InTypeDef;
static int IsAuto;
static int NoTypeDeclare;
static int IsDim;
static int IsExported;
static int IsRegister;
static int IsStatic;
static int IsStdFunc;
static int IsLocal;
static int IsRaw;
static int IsApple;
static int KillCFile;
static char Keyword1[65535];
static int LastCmd;
static int LinesRead;
static char Linker[65535];
static char Lookup[65535];
static int MakeDLL;
static int Ndx;
static int NoMain;
static int NoDllMain;
static int OkayToSend;
static char Op[65535];
static int OptionBase;
static char OutfileClone[65535];
static int PassOne;
static int ProtoCnt;
static int Pusher;
static int Quiet;
static int ReDirect;
static FILE *SaveOutfileNum;
static char Scoot[65535];
static int ShowStatus;
static int SrcCnt;
static int SrcFlag;
static int TrcFlag;
static int TestForBcxIni;
static char FileIn[65535];
static char FileOut[65535];
static char FileErr[65535];
static char T[65535];
static int Test;
static int Statements;
static int TestState;
static char Tipe[65535];
static int TranslateSlash;
static int UseCpp;
static int UseFlag;
static int InNameSpace;
static int Use_Virtual;
static char vproc[65535];
static int UseStdCall;
static int UseLCaseTbl;
static char Var[65535];
static int XitCount;
static char Z[65535];
static char ConstLastDef[65535];
static int Use_AnsiToWide;
static int Use_Asc;
static int Use_AppExeName;
static int Use_AppExePath;
static int Use_Boolstr;
static int Use_Bor;
static int Use_Band;
static int Use_Bnot;
static int Use_BcxSplitPath;
static int Use_Bin;
static int Use_Bin2dec;
static int Use_Osx;
static int Use_Cvd;
static int Use_Cvld;
static int Use_Cvi;
static int Use_Cvl;
static int Use_Cvs;
static int Use_Chr;
static int Use_Cdbl;
static int Use_Cldbl;
static int Use_Csng;
static int Use_Clear;
static int Use_Cbool;
static int Use_Cint;
static int Use_Clng;
static int Use_Cls;
static int Use_Color;
static int Use_Command;
static int Use_ContainedIn;
static int Use_Console;
static int Use_CopyFile;
static int Use_Static;
static int Use_Crlf;
static int Use_Curdir;
static int Use_Del;
static int Use_Download;
static int Use_Dynacall;
static int Use_DynamicA;
static int Use_Embed;
static int Use_Enclose;
static int Use_Environ;
static int Use_EnumFile;
static int Use_Eof;
static int Use_Exist;
static int Use_ExitCode;
static int Use_Extract;
static int Use_LoadFile;
static int Use_FillArray;
static int Use_Findfirst;
static int Use_Findnext;
static int Use_FindInType;
static int Use_Fint;
static int Use_Fix;
static int Use_FileLocked;
static int Use_Frac;
static int Use_Fracl;
static int Use_Freefile;
static int Use_Get;
static int Use_GetCh;
static int Use_GenFree;
static int Use_Gosub;
static int Use_Gtk;
static int Use_Glib;
static int Use_Hex;
static int Use_Hex2Dec;
static int Use_Iif;
static int Use_Imod;
static int Use_Inkey;
static int Use_InkeyD;
static int Use_Ins;
static int Use_Instr;
static int Use_Inchr;
static int Use_Isptr;
static int Use_iReplace;
static int Use_IRemove;
static int Use_Instrrev;
static int Use_Join;
static int Use_Keypress;
static int Use_Lcase;
static int Use_Ldouble;
static int Use_Left;
static int Use_Like;
static int Use_Lineinput;
static int Use_Loc;
static int Use_Locate;
static int Use_Lof;
static int Use_Lpad;
static int Use_Ltrim;
static int Use_Mcase;
static int Use_Mid;
static int Use_Midstr;
static int Use_Mkd;
static int Use_Mkld;
static int Use_Mki;
static int Use_Mkl;
static int Use_Mks;
static int Use_Min;
static int Use_Max;
static int Use_Now;
static int Use_Numqsortdint;
static int Use_Numqsortaint;
static int Use_Numqsortdfloat;
static int Use_Numqsortafloat;
static int Use_Numqsortddouble;
static int Use_Numqsortadouble;
static int Use_Idxqsort;
static int Use_IdxqsortSt;
static int Use_PtrqsortSt;
static int Use_Oct;
static int Use_Overloaded;
static int Use_OSVersion;
static int Use_Pause;
static int Use_PeekStr;
static int Use_Put;
static int Use_QBColor;
static int Use_Randomize;
static int Use_Rec;
static int Use_RecCount;
static int Use_Remain;
static int Use_Remove;
static int Use_Repeat;
static int Use_Replace;
static int Use_Reverse;
static int Use_Right;
static int Use_Rpad;
static int Use_Rnd;
static int Use_Exp;
static int Use_Retain;
static int Use_Round;
static int Use_Rtrim;
static int Use_Run;
static int Use_Scan;
static int Use_Inputbuffer;
static int Use_SearchPath;
static int Use_StrUpLow;
static int Use_Shell;
static int Use_Sgn;
static int Use_SingleFile;
static int Use_Space;
static int Use_Split;
static int Use_DSplit;
static int Use_StartupCode;
static int Use_Stristr;
static int Use_StrStr;
static int Use_Str;
static int Use_Strl;
static int Use_Str_Cmp;
static int Use_Strim;
static int Use_String;
static int Use_Strptr;
static int Use_Strqsorta;
static int Use_Strqsortd;
static int Use_Strtoken;
static int Use_DynStrqsorta;
static int Use_DynStrqsortd;
static int Use_Swap;
static int Use_Sysdir;
static int Use_SysStr;
static int Use_sziif;
static int Use_Tally;
static int Use_Tempdir;
static int Use_TempFileName;
static int Use_Threads;
static int Use_Time;
static int Use_Timer;
static int Use_Trim;
static int Use_Turbo;
static int Use_Ubound;
static int Use_Ucase;
static int Use_Using;
static int Use_VChr;
static int Use_Verify;
static int Use_Val;
static int Use_Vall;
static int Use_WideToAnsi;
static int Use_Wx;
static int Use_WxC;
static int Use_Ctor;
static int Use_Instat;
static int Use_Socket;
static int Use_IOS;
static int Use_RegEx;
static int Use_BEL;
static int Use_BS;
static int Use_CR;
static int Use_DDQ;
static int Use_DQ;
static int Use_EOF;
static int Use_ESC;
static int Use_FF;
static int Use_LF;
static int Use_NUL;
static int Use_SPC;
static int Use_TAB;
static int Use_VT;
static char prcFile[65535];
static char udtFile[65535];
static char datFile[65535];
static char cstFile[65535];
static char ovrFile[65535];
static char hdrFile[65535];
static char setFile[65535];
static char enuFile[65535];
static char *szTmp;
static char *Src;
static char *AbortSrc;
static char *WarnMsg;
static char *RmLibs;
static FILE *SourceFile;
static FILE *FP2;
static FILE *FP3;
static FILE *FP4;
static FILE *FP5;
static FILE *FP6;
static FILE *FP7;
static FILE *FP8;
static FILE *FP9;
static FILE *FP11;
static FILE *Outfile;
static FILE *FP1;
static int DoCountLines;
static FILE *FP10;
static FILE *ResIn;
static FILE *ResOut;
static FILE *UserResIn;
static FILE *fpErr;
static FILE *fpHFile;
static FILE *FP68;
static FILE *fpdef;
static int SFPOINTER;
static int WithCnt;
static char ByrefVars[1024][65535];
static int LoopLocalVar[256];
static int BaseTypeDefsCnt[16];
static char Modules[256][65535];
static int ModuleLineNos[256];
static FILE *FPtr[256];
static char Stk[4096][65535];
static ProtoStore ProtoType[1024];
static char SrcStk[128][65535];
static char SplitStk[128][65535];
static char CaseStk[256][65535];
static int CaseElseFlag[256];
static char Entry[256][65535];
static char Xit[256][65535];
static char LocalDynArrName[256][65535];
static char GlobalDynaStr[256][65535];
static char DynaStr[256][65535];
static char StartSub[32][65535];
static char ExitSub[32][65535];
static char Library[MaxLib][65535];
static int GlobalVarHash[MaxGlobalVars];
static VarInfo GlobalVars[MaxGlobalVars];
static VarInfo LocalVars[MaxLocalVars];
static UserTypeDefs TypeDefs[MaxTypes];
static char DllDecl[800][512];
static char Loadlibs[128][512];
static char HFiles[128][65535];
static char TypeName[16][65535];
static char WithVar[8][65535];
// *************************************************
// Standard Macros
// *************************************************
#define FDRV 2
#define FPATH 4
#define FNAME 8
#define FEXT 16
#define BAND &
#define BOR |
#define imod(a,b)((a)%(b))
#define VAL(a)(double)atof(a)
// *************************************************
// Standard Prototypes
// *************************************************
int str_cmp(char*, char*);
int EoF (FILE*);
void cls(void);
void locate (int,int,int=1,int=12);
void midstr (char*, int, int, char *);
char* BCX_TmpStr(size_t);
char* sziif (bool,char*,char*);
char* TempFileName (char*,char*);
char* AppExePath (void);
char* AppExeName (void);
char* lcase (char*);
char* ucase (char*);
char* mid (char*, int, int=-1);
char* ltrim (char*,char=32);
char* rtrim (char*,char=32);
char* trim (char*);
char* strim (char*);
char* left (char*,int);
char* right (char*,int);
char* rpad (char*,int,int=32);
char* lpad (char*,int,int=32);
char* stringx (int,int);
char* extract (char*,char*);
char* remain (char*,char*);
char* command (int=-1);
char* replace (char*,char*,char*);
char* iReplace (char*,char*,char*);
void Shell (char *);
char* space (int a);
char* str (double);
char* curdir (void);
char* tempdir (void);
char* Environ (char*);
char* _strupr_(char *);
char* _strlwr_(char *);
char* BcxSplitPath (char *, int);
void _splitpath_(const char* path, char* drv, char* dir, char* name, char* ext);
char* StrToken (char*,char*,int);
char* RemoveStr (char*,char*);
char* IRemoveStr (char*,char*);
char* join (int, ... );
char* enc (char*, int=0, int=0);
char* chr(int,int=0,int=0,int=0,int=0,int=0,int=0,int=0,int=0,int=0);
char* vchr (int,...);
int InstrRev (char*,char*,int=0,int=0);
int instr_b(char*,char*,int=0,int=0);
char *MakeLCaseTbl(void);
char *_stristr_(char*,char*);
char *_strstr_(char*,char*);
int inchr (char*,char*);
int tally (char*,char*,int=0);
BOOL Exist (char*);
char* ins (char *S, int i, char *a);
char* del (char*,int,int);
DWORD lof (char*);
double Round (double,int);
float rnd (void);
double _MIN_ (double,double);
double _MAX_ (double,double);
int containedin(char * ,char **,int=0);
// *************************************************
// User Prototypes
// *************************************************
int main (int, PCHAR* );
void EmitCmdLineConst (void);
void EmitCompilerDefines (void);
void MakeFreeGlobals (void);
void ProcessSetCommand (int);
int Directives (void);
int SubVarType (int);
char * PrintWriteFormat (int);
void EmitInputCode (void);
void EmitFileInputCode (void);
void AddFuncs (void);
int CheckLocal (char *, int* );
int CheckGlobal (char *, int* );
int CheckType (char *);
void ExportInternalConst (void);
int RestrictedWords (char *);
int DataType (char *);
void CloseAll (void);
char * Clean (char *);
void RemoveAll (char* ,char* ,int=0);
void Warning (char* ,int=0);
PCHAR GetVarTypeName (int);
int HashNumber (char *);
void AddLibrary (char *);
void RemoveLibrary (char *);
void EmitLibs (void);
void AddGlobal (char* ,int,int,char* ,int,int,int,int,int=0);
void AddLocal (char* ,int,int,char* ,int,int,int,int=0);
int IsNumber (char *);
int IsNumberEx (char *);
void StripTabs (void);
void PushFileIO (void);
void PopFileIO (void);
int Inset (char *, char *);
void CheckParQuotes (void);
void ClearIfThenStacks (void);
int IsQuoted (char *);
void PostProcess (void);
void XParse (char *);
void TokenSubstitutions (void);
void JoinStrings (int, int);
void Transforms (void);
void Parse (char *);
void FuncSubDecs1 (char *);
void RemEmptyTokens (void);
void FuncSubDecs2 (char *, int);
void FuncSubDecs3 (VARCODE* );
void AddTypeDefs (char *, int);
int DefsID (char *);
void GetTypeInfo (char *, int* , int* , int* );
void AddTypedefElement (int, int, char *, char *, int);
char * GetElement (int, int* , int* , int);
int GetElementInfo (int* , int* , char *);
void HandleNonsense (void);
void ValidVar (char *);
void PointerFix (void);
void DimDynaString (char *, int, int);
int SubFuncTest (void);
int DimSubFunc (int);
void Emit (void);
void Abort (char *);
void BumpDown (void);
void BumpUp (void);
int BraceCount (char *);
char* BracketHandler (char *, int);
void Push (char *);
void Pop (char *);
void EmitEpilog (void);
void EmitProlog (void);
void DeclareVariables (void);
int GetNumArgs (int,int* =NULL);
void GetVarCode (VARCODE* );
void AddProtos (void);
void RunTimeFunctions (void);
int JoinLines (char *);
void StripCode (char *);
void ProcSingleLineIf (int* );
int SplitLines (char *);
int iMatch (char *, char *, int);
int iMatchNQ (char *, char *);
int SpecialCaseHandler (char *);
void FastLexer (char* ,char* ,char* ,int=1);
void InsertTokens (int, int, ...);
void EmitExportDef (char *);
char * GetArg (int, functionParse* );
int SepFuncArgs (int, functionParse* , int);
PCHAR MakeDecProto (functionParse* );
void AsmUnknownStructs (int);
void EmitIfCond (char *);
void PrintGlobal (int, int, char *, char *, char *, char *);
void ReDirectFPrint (FILE*, char *, ...);
int IsReservedWord (char *);
int GetAsPos (void);
void FreeGlobals (void);
// *************************************************
// User Global Initialized Arrays
// *************************************************
// *************************************************
// User GLOBAL SET Statements
// *************************************************
static char* VarTypeLookup[]=
{
"int","int","char *","double","float","FILE *","long double"
};
static char VarConst[2][8]=
{
"",
"const "
};
static char VarStorage[6][18]=
{
"static ",
"extern ",
"",
"static volatile ",
"extern volatile ",
"volatile "
};
static char* ReservedWord[]=
{
"IF",
"ELSEIF",
"THEN",
"ELSE",
"AND",
"OR",
"NOT",
"BOR",
"BAND",
"XOR",
""
};
// *******************************************************************************
// Developer Guidelines
// *******************************************************************************
// Code should be written in BCX Basic. If it can not be written in BCX Basic for
// some reason or results in code that seems too inefficient then this may be a
// cue that a new Basic function is needed.
// * All KEYWORDS should be capitalized
// * Use two space indentation
// * Use spaces not tabs
// * Record all notes in reverse chronological order
// * And most importantly....Have fun!
// ******************************************************************************************
// This section is used to communicate to-do 's, changes, ideas, suggestions, etc.
// ******************************************************************************************
// -------------------------------------------
// 2022-07-26 Armando Rivera
// After a LONG time away....
// * Changed max size of szTmp$, Src$, and AbortSrc$ (65535)to avoid potential buffer overflows
// * Changed max size of WarnMsg$ (65536) to avoid potential buffer overflow
// * Removed the "register" decorator from EOF function to comply with C++17 standard
// * The above addressed warnings thrown by C++17, which is the standard on modern Linux.
// * Removed cdecl/stdcall from "Declare Function" (dynamic linking), since cdecl is the standard on *nix systems
// -------------------------------------------
// 2018-12-12 Armando Rivera
// * Changed BcxRegEx function to REGMATCH
// * Changed BcxRegEx keyword to REGMATCH
// * Added $MODULE as alias to $INCLUDE to support external modules. ** MUST BE AT TOP OF MAIN SOURCE FILE **
// * Added $LDFLAGS directive to support external modules
// -------------------------------------------
// -------------------------------------------
// 2016-02-15 Armando Rivera
// -------------------------------------------
// * Changed default string size to 65K from
// 2k, which was limiting.
// * Updated output of PRINT command, eliminating
// leading spaces from numbers.
// -------------------------------------------
// 2015-07-03 Armando Rivera
// -------------------------------------------
// * Changed $OSX flag to use Cocoa instead of Carbon in MacOS
// This is in preparation of the new custom libcocoa library
// that I'm currently creating that will allow mbc
// to create 64bit GUI applications in OSX
// -------------------------------------------
// 2013-06-26 Armando Rivera
// -------------------------------------------
// * Added BcxRegex keyword, based on Posix Regex in Libc
// * Broke up main source file into files containing Runtime, Declarations, etc.
// * Added BYTE type
//
// -------------------------------------------
// 2013-06-17 Armando Rivera
// -------------------------------------------
// * Tweaked HEX$ so that it will emit 2-digit hex numbers
// * Added PUCHAR (unsigned char*) typedef
// -------------------------------------------
// 2011-03-11 Armando Rivera
// -------------------------------------------
// * Added Wayne's suggestion to support Reference Variables as return types.
//
// -------------------------------------------
// 2011-03-10 Armando Rivera
// -------------------------------------------
// * Ported $PROJECT directive from ConsoleBC. This doesn't emit the RTL yet, but it's a start.
// It's the first step towards re-writing the RT code to leverage CPP/WX.
//
// * Fixed bug where BCX_TmpStr sometimes wasn't emitted when returning a string from a function
//
// * Added Named Enum support. Syntax:
// myenum AS ENUM
// …
// END ENUM
//
// This required moving the Enum emit code to before the User Prototype emit code
// to allow passing the named enum to user defined functions.
//
// -------------------------------------------
// 2011-01-23 Armando Rivera
// -------------------------------------------
// * Initial Beta1 Release
//
// * Fixed bug in INPUT statement to remove trailing newlines (James Fuller)
//
// * Removed COLOR statements to avoid terminal output issues with redirected
// translator output (James Fuller)
//
// * Added CONST keyword when declaring variables (Global, Local, and as Function/Sub parameters)
// At the moment, this is experimental (meaning I haven't fully tested it) but it seems to work
//
// * Added PRIVATE keyword for CPP classes
// -------------------------------------------
// 2010/12/21 Armando Rivera
// -------------------------------------------
// * Cleaned up code emission so that unneeded defines/global vars are not emitted
//
// * Added new $IOS directive, which is MAC ONLY, to compile source for iDevices (iPhone/iTouch/AppleTV2)
// At this point in time, running binaries built this way requires a jailbroken iDevice.
// This is experimental, and for console apps only for now.
// A simple console example is in the Examples/IOS folder
// -------------------------------------------
// 2010/12/11 Armando Rivera
// -------------------------------------------
// * Add new Socket keywords: BcxSocket, BcxSocketSend, BcxSocketRead, and BcxSocketClose
// See the BcxSocket.bas demo in the Examples/Socket folder for info.
//
// * Added kbhit() , which doesn't exist outside of Windows
// This is a custom sub which emulates what kbhit() does
//
// * Changed the conditional emission of term.h to only be emitted when
// Use_Keypress is TRUE (InKey)
//
// -------------------------------------------
// 2010/12/01 Armando Rivera
// -------------------------------------------
// * Changed wxApp emission to use BCXPLITHPATH$, per James Fuller's suggestion.
//
// * Added support for Abstract Classes (gcc doesn't have the INTERFACE keyword)
//
// Example:
// Class MyAbstractClass
// public
//
// virtual sub Proc1() = 0
// Virtual sub Proc2()=0
// virtual function Proc3(a$,b$) as integer = 0
//
// End Class
// -------------------------------------------
// 2010/11/30 Armando Rivera
// -------------------------------------------
// * Removed $CLASS/$ENDCLASS $NAMESPACE/$ENDNAMESPACE
// Using either will emit a message stating that they have been replaced.
//
// * Addded NAMESPACE / END NAMESPACE
// This allows creating methods within the NAMESPACE like so:
//
// $CPP
// $NOMAIN
// $EXECON
// '==============================================================================
// NAMESPACE Dlg_01
// Sub DoIt()
// Print "Dlg_01"
// End Sub
//
// Function GetString$(A$) as string
// function = "The String you Passed Was: " + enc$(A$)
// end function
// END NAMESPACE
// '==============================================================================
// Function main(argc as INTEGER, argv as PCHAR ptr) as INTEGER
// Print "James"
// Dlg_01::DoIt()
// print Dlg_01::GetString$("Hello, World!")
// End Function
//
// * If using $WX, the #define for Clear() will not be emitted due to conflict
// with Classes that have that method defined
//
// * Made the inclusion of "term.h" conditional based on whether $WX/$WXC
// is used. "term.h" is required for the implementation of
// the PAUSE keyword in CONSOLE apps.
//
// -------------------------------------------
// 2010/11/25 Armando Rivera
// -------------------------------------------
// * Changed code so that in $CPP mode, the case of the emitted
// .cpp filename is preserved (James Fuller bug report)
//
// -------------------------------------------
// 2010/11/24 Armando Rivera
// -------------------------------------------
// * Minor change in StripCode() to correct
// possible overflow issue under 64bit Linux (James Fuller bug report)
//
// * Added $WXC Directive to support WX Console-Based Apps
// Using this switch, neither a wxApp or the IMPLEMENT_APP() macro are
// auto added to the translated source (James Fuller request)
// -------------------------------------------
// 2010/11/20 Armando Rivera
// -------------------------------------------
// * Changed $DLL directive so that it would generate *nix Shared Libraries.
// * Added $DLL support to $EXECON
// * Added required flags to LD_FLAGS$ for creating *nix Shared Libraries
// Example:
// $dll
// $execon
//
// function printdemo() export
// print "This was called from a Dynamic Library"
// end function
//
// Note that this is currently only useful for creating shared libraries
// for **OTHER** languages; it won't work with MBC created apps because of
// duplicate naming conflicts.
//
// -------------------------------------------
// 2010/11/18 Armando Rivera
// -------------------------------------------
// * Removed "-Os" compiler optimization flag from $EXECON for fastest tranlator compliation
// during Alpha testing stage.
//
// This will be re-added when translator is not longer in Alpha status
//
// * Added USE_CTOR global as flag for supporting Constructor/Destructor syntax
//
// * Added "USING" keyword for CONSTRUCTOR/DESTRUCTOR methods. It is used like this:
//
// CONSTRUCTOR MainWin::MainWin(title as wxString, winStyle as long) USING wxFrame( 0, -1, title, wxPoint(50,50), wxSize(490,296), winStyle )
//
// Which will emit:
//
// MainWin::MainWin (wxString title, long winStyle)
// : wxFrame( 0, -1, title, wxPoint(50,50), wxSize(490,296), winStyle )
// {
//
// * Added code to extract and emit derived class methods
//
// -------------------------------------------
// 2010/11/17 Armando Rivera
// -------------------------------------------
// * Added new CLASS / END CLASS / PUBLIC / PROTECTED / CONSTRUCTOR / DESTRUCTOR keywords.
// These additions flesh out Basic-Like C++ CLASS support, superceding $CLASS/$ENDCLASS,
// and now allows syntax like the following:
//
// $CPP
// $NOMAIN
// $execon
//
// class MyClass
//
// protected
// first as string
// secnd$
// third%
//
// public
// type ATest
// a as PCHAR
// b as long
// c as single
// d as float
// end type
//
// Constructor MyClass(a$, b)
// Destructor MyClass()
// end class
//
// FUNCTION main(argc as INTEGER, argv as PCHAR ptr) as INTEGER
// RAW theClass as MyClass PTR
//
// theClass = new MyClass("Hello", 12)
//
// print (char*)theClass->ATest.a
// print theClass->ATest.b
// END FUNCTION
//
// Constructor MyClass::MyClass(a$,b)
// ATest.a = a$
// ATest.b = b
// END Constructor
// '
// Destructor MyClass::~MyClass()
//
// END Destructor
//
// -------------------------------------------
// 2010/11/12 Armando Rivera
// -------------------------------------------
// * Added code that (mostly) eliminates the need for a trailing ";" in $class/$endclass
//
// * Added code to allow the use of "SUB" in $class/$endclass. It just substitutes "void" for "sub"
// at this point.
//
// * Fixed "THIS" keyword code so that it emits a lowercase "this". Linux/OSX aren't affected
// by this breaking COM statements. :-P Thanks to JCFULLER for the tip!
//
// * For $CPP mode, added typedefs for std::string (CSTRING) and std::fstream (CFILE)
// These are direct replacements for STRING and FILE, and allows the full use of each
// C++ object/class.
//
// So instead of "dim mystring as string", for example, you would do "dim mystring as CSTRING".
// You would then have access to all of std::string's methods like .replace, .substr, .compare, etc.
//
// I'm considering doing the same with the other toolkit directives ($OSX, $GTK, etc) but we'll see...
//
// * Added "inherits" in $CPP mode so that subclassing can be done like so:
//
// $class MyClass inherits AnotherClass
//
// * For $WX mode, added code to automatically emit the required derived wxApp class.
// Note that it will be named the same as your sourcefile (minus the extension), and you MUST provide
// a "FUNCTION ::OnInit() as bool" for it:
//
// FUNCTION TestApp::OnInit() as bool
// <initialize app here>
// END FUNCTION
//
// * For $WX mode, made "$NOMAIN" the default, so no need to pass that directive
//
// * Colorized some of the compiler output text. Just because I can.
//
// * Back-ported Wayne's changes to "WITH" to allow the use of "->" syntax
//
// * TODO:
// Finish off the $class/$endclass code to allow full basic syntax for method and variable
// declarations.
//
// Remove ALL remaining WIN32 related code and ifdefs.
// No need for that stuff under Linux/OSX, the Windows version of BCX can handle all
// of the Windows stuff one might need.
//
// Other stuff I can't remember right now…..
// -------------------------------------------
// 2010/03/31 Armando Rivera
// Beginning with this version of the console compiler,
// the goal is to have a 100% unified code-base, because
// I'm fracking tired of trying to maintain separate builds
// for different Operating Systems.
// -------------------------------------------
//
// * Added $OSX, $GTK¸$GLIB and $WX Directives
// (Use_Osx, Use_Wx, Use_Gtk, Use_Glib and LD_FLAGS$ Globals added)
//
// $OSX will automatically enable Carbon GUI support, and if $EXECON is invoked
// will also build a Universal Binary with 32bit and 64bit support
//
// $GTK will automatically enable GTK/GLIB support, and if $EXECON is invoked
// will build the executable linking in libgtk and it's support libraries.
//
// $GLIB will automatically enable >GLIB ONLY< support, and if $EXECON is invoked
// will build the executable linking in libglib and it's support libraries.
//
// $WX will automatically enable wxWidgets with $CPP set to "TRUE", and if $EXECON
// is invoked will build the executable linking in libwx and it's support libraries
//
// This is, in part, in preparation for moving the GTK support from the core of the
// LinuxBC translator to an external library which will be linked in as required. This
// will GREATLY simplify maintenence of the translator core once the lib is ready.
//
// * Changed alls instances of byte* to UCHAR* in SWAP() Function
//
// * Added internal return values for PUT/GET to get rid of ALL compiler warnings.
//
// * Updated runtime functions calling PUT()/GET()/fread()/fwrite so that they
// will not trigger compiler warnings
//
// * Reworked the way functions declared using C_DECLARE with the LIB and ALIAS keywords
// are emitted. This is so that you can dynamically load functions from a shared
// library at runtime via dlopen/dlsym.
//
// The syntax is:
// C_DECLARE FUNCTION <YOUR FUNCTION NAME> LIB <shared library> ALIAS <quoted name of actual function (<parameters>) AS <return type>
//
// For example:
// C_DECLARE FUNCTION b64encode LIB "libglib-2.0.so" ALIAS "g_base64_encode" (txt AS char*, length AS integer) AS string
// C_DECLARE FUNCTION g_base64_decode LIB "libglib-2.0.so" ALIAS "g_base64_decode" (txt AS char*, length AS INTEGER PTR) AS string
//
// NOTE that the ALIAS is the actual name of the function you want to call from the shared library.
// This is so you avoid redeclaration errors if you attempt to link to a library (libm is a good example)
// that is already compile-time linked with g++.
//
// NOTE 2: There is currently no checking whether the function was loaded without error. It is on the TODO list.
//
// * Changed compiler invocation to include -Wformat and -D_FORTIFY_SOURCE=2 (Ubuntu Standard)
//
// * Fixed User Include File handling in order to support mixed case filenames
//
// * Updated the CURDIR$, TEMPDIR$, AND SHELL code to eliminate warnings emitted when compiling on
// a system that has "_FORTIFY_SOURCE=2" enabled by default in GCC/G++ (Ubuntu)
//
// * Fixed a potential overflow problem with LINE INPUT that would also cause G++ to emit
// warnings as above.
//
// *Re-coded the $RESOURCE directive and the GETRESOURCE$ function to allow
// linking of Resources under Linux/Unix. Using $RESOURCE generates a #define
// allowing you to reference the embedded resource using an arbitrary IDENTIFIER.
//
// For example:
//
// DIRECTIVE FILE IDENTIFIER
// -------------------------------
// $RESOURCE "file.txt" "myres"
//
//
// Note that you reference the resource using the identifier you passed as the
// SECOND parameter to the $RESOURCE directive, minus the quotes.
//
// "file.txt" above can be any arbitrary file on one's system
//
// At the moment, the resource is returned as a string with the GETRESOURCE$ function.
// *****************************************************************************************************
// ** YOU WILL HAVE TO ENSURE THAT A BUFFER WITH ENOUGH SPACE TO HOLD THE RESOURCE HAS BEEN ALLOCATED **
// *****************************************************************************************************
// To aid in this, a constant is automatically created with the size of the resource. It will have the
// name you specified as the second parameter to $RESOURCE, with _SIZE appended.
// Using the example above, the constant would be defined as: myres_SIZE
//
//
// You should be able to manually cast the reference *itself* to what you require, since it is
// merely a pointer to the location of the resource itself.
//
// The resource will be converted to an object file, named using the filename provided with ".o" apppended.
// "file.txt" will be converted to "file.txt.o" in the above example, which can then be linked
// to the final executable via $EXECON "file.txt.o" or $EXEGUI "file.txt.o"
//
// * Tweaked $GUI directive and GUI keyword so that one can use the directive without
// having all of the support for BCX_* form objects automatically added to one's app.
//
// This is usefull when using GtkBuilder or Glade to build the user interface.
//
// -------------------------------------------
// 2010-01-17 Armando Rivera
// -------------------------------------------
// modified the $CLASS/$ENDCLASS directives to allow creation and inheritance of C++ Classes
//
// modified the Function/Sub prototype emitter so that it would not emit prototypes
// for C++ Class Methods, which are supposed to be prototyped within the Class itself
//
// made the inclusion of <term.h> conditional based on whether UseCPP is true/false
// it will not be included if UseCpp is "true" because some C++ toolkits (wxWidgets)
// throw a "redefined" error when it's included
//
// -------------------------------------------
// 2010-01-15 Armando Rivera
// -------------------------------------------
// per wmhalsdorf's recommendation, modified SplitLines and Emit procs to support
// C++ Method syntax (CLASSNAME::METHOD) [see Yahoo group Message #40282]
//
// -------------------------------------------
// 2010-01-10 Armando Rivera
// -------------------------------------------
// changed $CPP directive to output lowercase filenames
//
// -------------------------------------------
// 2009-10-18 Armando Rivera
// -------------------------------------------
// added Carbon.h as a default include, to support Carbon/CoreFoundation calls
// added Carbon framework to $execon section
// removed TRUE and FALSE defines, which are now provided by Carbon.h
// changed Handle$ to Handl$ to resolve conflict with Carbon.h
//
// -------------------------------------------
// 2009-10-13 Armando Rivera
// -------------------------------------------
// added typedef for "byte" type (typedef unsigned char byte;)
//
// *************************************************
// Runtime Functions
// *************************************************
char *BCX_TmpStr (size_t Bites)
{
static int StrCnt;
static char *StrFunc[512];
StrCnt=((StrCnt+1) &511);
#if defined BCX_MAX_VAR_SIZE
if(Bites*sizeof(char)>BCX_MAX_VAR_SIZE)
{
printf("Buffer Overflow caught in BCX_TmpStr - requested space of %d EXCEEDS %d\n",(int)(Bites*sizeof(char)),BCX_MAX_VAR_SIZE);
abort();
}
#endif
StrFunc[StrCnt]=(char*)realloc(StrFunc[StrCnt],Bites + 128);
return (char*)memset(StrFunc[StrCnt],0,Bites+128);
}
int str_cmp (char *a, char *b)
{
int counter=0;
for(;;)
{
if((a[counter]^b[counter]))
{
if((UINT) a[counter]>= (UINT) b[counter])
return 1;
return -1;
}
if(!a[counter]) return 0;
counter++;
}
}
int EoF (FILE* stream)
{
int c, status = ((c = fgetc(stream)) == EOF);
ungetc(c,stream);
return status;
}
char *left (char *S, int length)
{
int tmplen = strlen(S);
if(length<1) return BCX_TmpStr(1);
if(length<tmplen) tmplen=length;
char *strtmp = BCX_TmpStr(tmplen);
return (char*)memcpy(strtmp,S,tmplen);
}
char *right (char *S, int length)
{
int tmplen = strlen(S);
char *BCX_RetStr = BCX_TmpStr(tmplen);
tmplen -= length;
if (tmplen<0) tmplen = 0;
return strcpy(BCX_RetStr, &S[tmplen]);
}
char *rpad (char *a, int L, int c)
{
char *strtmp;
int s = strlen(a);
if((L-s)<1) return a;
strtmp=BCX_TmpStr(L);
strcpy(strtmp,a);
memset(&strtmp[s],c,(L-s));
return strtmp;
}
char *lpad (char *a, int L, int c)
{
char *strtmp;
L=L-strlen(a);
if(L<1) return a;
strtmp = BCX_TmpStr(L);
memset(strtmp,c,L);
return strcat(strtmp,a);
}
char *mid (char *S, int start, int length)
{
char *strtmp;
int tmplen = strlen(S);
if(start>tmplen||start<1) return BCX_TmpStr(1);
if (length<0 || length>(tmplen-start)+1)
length = (tmplen-start)+1;
strtmp = BCX_TmpStr(length);
return (char*)memcpy(strtmp,&S[start-1],length);
}
char *trim (char *S)
{
while(*S==32 || *S==9 || *S==10 || *S==11 || *S==13)
S++;
int i = strlen(S);
while( i>0 && (S[i-1]==32 || S[i-1]==9 || S[i-1]==10
|| S[i-1]==11 || S[i-1]==13))
i--;
char *strtmp=BCX_TmpStr(i);
return (char*)memcpy(strtmp,S,i);
}
char *ltrim (char *S, char c)
{
if(S[0]==0) return S;
while((*S==32 || *S==c) && *S !=0) S++;
char *strtmp = BCX_TmpStr(strlen(S));
return strcpy(strtmp,S);
}
char *rtrim (char *S,char c)
{
if(S[0]==0) return S;
int i = strlen(S);
while(i>0 && (S[i-1]==c || S[i-1]==32))
i--;
char *strtmp = BCX_TmpStr(i);
return (char*)memcpy(strtmp,S,i);
}
char *strim (char *src)
{
char *strtmp = BCX_TmpStr(strlen(src));
char *dst = strtmp;
while (isspace((unsigned char)*src)) src++;
do
{
while (*src && !isspace((unsigned char)*src)) *dst++ = *src++;
if (*src)
{
*dst++ = *src++;
while (isspace((unsigned char)*src)) src++;
}
} while (*src);
if (isspace((unsigned char)*(--dst))) *dst = 0;
return strtmp;
}
char *command (int nArg)
{
int i = 0;
char *retstr=BCX_TmpStr(1);
if(nArg < i) // return entire commandline
{
retstr = BCX_TmpStr(G_argc * 2048);
for(i=1; i < G_argc; i++)
{
strcat(retstr, G_argv[i]);
strcat(retstr, SPC);
}
}
else if(nArg < G_argc)
{
retstr = BCX_TmpStr(strlen(G_argv[nArg]) + 1);
strcpy(retstr, G_argv[nArg]);
}
return retstr;
}
char *extract (char *mane, char *match)
{
char *a;
char *strtmp = BCX_TmpStr(strlen(mane));
if(*match!=0)
{
a=_strstr_(mane,match);
if(a) return (char*)memcpy(strtmp,mane,a-mane);
}
return strcpy(strtmp,mane);
}
char *remain (char *mane, char *mat)
{
char *p = strstr(mane,mat);
if(p)
{
p+=(strlen(mat));
return p;
}
return mane;
}
char *replace (char *src, char *pat, char *rep)
{
size_t patsz, repsz, tmpsz, delta;
char *strtmp, *p, *q, *r;
if (!pat || !*pat)
{
strtmp = BCX_TmpStr(strlen(src));
if (!strtmp) return NULL;
return strcpy(strtmp, src);
}
repsz = strlen(rep);
patsz = strlen(pat);
for (tmpsz=0, p=src; (q=_strstr_(p,pat))!=0; p=q+patsz)
tmpsz += (size_t) (q - p) + repsz;
tmpsz += strlen(p);
strtmp = BCX_TmpStr(tmpsz);
if (!strtmp) return NULL;
for (r=strtmp,p=src; (q=_strstr_(p,pat))!=0;p=q+patsz)
{
delta = (size_t) (q-p);
memcpy(r,p,delta); r += delta;
strcpy(r,rep); r += repsz;
}
strcpy(r,p);
return strtmp;
}
char *ucase (char *S)
{
char *strtmp = BCX_TmpStr(strlen(S));
return _strupr_(strcpy(strtmp,S));
}
char *lcase (char *S)
{
char *strtmp = BCX_TmpStr(strlen(S));
return _strlwr_(strcpy(strtmp,S));
}
char *RemoveStr (char *a, char *b)
{
char *strtmp, *p, *d;
int tmplen;
strtmp = d = BCX_TmpStr(strlen(a));
if(!b || !*b) return strcpy(strtmp,a);
p=_strstr_(a,b); tmplen = strlen(b);
while(p)
{
memcpy(d,a,p-a);
d+= (p-a);
a=p+tmplen;
p=_strstr_(a,b);
}
strcpy(d,a);
return strtmp;
}
char *IRemoveStr (char *a, char *b)
{
char *strtmp, *p, *d;
int tmplen;
strtmp = d = BCX_TmpStr(strlen(a));
if(!b || !*b) return strcpy(strtmp,a);
p=_stristr_(a,b); tmplen = strlen(b);
while(p)
{
memcpy(d,a,p-a);
d+= (p-a);
a=p+tmplen;
p=_stristr_(a,b);
}
strcpy(d,a);
return strtmp;
}
char *ins (char *S, int i, char *a)
{
int j = strlen(S);
if(i<1 || i>j+1) return S;
char *strtmp = BCX_TmpStr(j + strlen(a));
memcpy(strtmp,S,--i);
strcpy(&strtmp[i],a);
return strcat(strtmp,&S[i]);
}
char *del (char *S, int i, int j)
{
int ln = strlen(S);
if(i<1 || i>ln) return S;
char *strtmp = BCX_TmpStr(ln);
memcpy(strtmp,S,--i);
return strcat(strtmp,&S[i+j]);
}
char *str (double d)
{
char *strtmp = BCX_TmpStr(16);
sprintf(strtmp,"% .15G",d);
return strtmp;
}
char *curdir (void)
{
char *strtmp = BCX_TmpStr(2048);
char *res=getcwd(strtmp, 1024);
return strtmp;
}
char *tempdir (void)
{
char *strtmp = BCX_TmpStr(2048);
if(!Exist("/tmp/mbc.compiler")) {
mkdir ("/tmp/mbc.compiler",0755);
}
strcpy(strtmp,"/tmp/mbc.compiler");
return strtmp;
}
char *stringx (int count, int a)
{
if(count<1) return BCX_TmpStr(1);
char *strtmp = BCX_TmpStr(count);
return (char*)memset(strtmp,a,count);
}
void Shell (char *cmd)
{
int res=system(cmd);
}
char *space (int count)
{
if(count<1) return BCX_TmpStr(1);
char *strtmp = BCX_TmpStr(count);
return (char*)memset(strtmp,32,count);
}
char *enc (char *A, int L, int R)
{
char *BCX_RetStr = BCX_TmpStr(strlen(A)+3);
if(L==0) L=34;
if(R==0) R=L;
sprintf(BCX_RetStr,"%c%s%c%s",L,A,R,"");
return BCX_RetStr;
}
char *chr (int a,int b,int c,int d,int e,int f,int g,int h,int i,int j)
{
char *strtmp = BCX_TmpStr(11);
strtmp[0] = a;
strtmp[1] = b;
strtmp[2] = c;
strtmp[3] = d;
strtmp[4] = e;
strtmp[5] = f;
strtmp[6] = g;
strtmp[7] = h;
strtmp[8] = i;
strtmp[9] = j;
strtmp[10] = 0;
return strtmp;
}
char *vchr(int charcount, ...)
{
int c = 0, i = charcount;
char *s_ = BCX_TmpStr(charcount + 1);
va_list marker;
s_[i] = 0;
va_start(marker, charcount);
while(i-- > 0) s_[c++] = va_arg(marker,int);
va_end(marker);
return s_;
}
char * join(int n, ...)
{
int i = n, tmplen = 0;
char *strtmp, *s_;
va_list marker;
va_start(marker, n); // Initialize variable arguments
while(i-- > 0)
{
s_ = va_arg(marker, char *);
if(s_) tmplen += strlen(s_);
}
strtmp = BCX_TmpStr(tmplen);
va_end(marker); // Reset variable arguments
i = n;
va_start(marker, n); // Initialize variable arguments
while(i-- > 0)
{
s_ = va_arg(marker, char *);
if(s_) strcat(strtmp, s_);
}
va_end(marker); // Reset variable arguments
return strtmp;
}
char* Environ(char *S)
{
char *strtmp, *tmp;
tmp = getenv(S);
if(tmp != NULL) {
strtmp = BCX_TmpStr(strlen(tmp)+1);
return strcpy(strtmp, tmp);
}
return BCX_TmpStr(1);
}
char *AppExePath (void)
{
char fullpath[MAX_PATH];
int length;
length = readlink("/proc/self/exe", fullpath, MAX_PATH);
if(length < 1) return BCX_TmpStr(1);
fullpath[length] = 0;
return BcxSplitPath(fullpath, FDRV|FPATH);
}
char *AppExeName (void)
{
return BcxSplitPath(G_argv[0], FNAME|FEXT);
}
char * TempFileName (char *dr, char *prefix)
{
static unsigned int count;
char *f, *tmpstr = BCX_TmpStr(MAX_PATH);
int i, length;
if(!count) srand(time(0));
if(dr) strcpy(tmpstr, dr);
length = strlen(tmpstr);
if(length && (tmpstr[length-1] != '\\' && tmpstr[length-1] != '/'))
tmpstr[length++] = '/';
if(prefix) strcpy(&tmpstr[length], prefix);
f = &tmpstr[strlen(tmpstr)];
do {
count++;
for(i=0; i<5; i+=1)
{
do {
f[i]=(char)(rnd()*122);
}while((f[i]<65)||(f[i]>90&&f[i]<97));
}
snprintf(&f[5],3,"%x", count);
} while (Exist(tmpstr));
return tmpstr;
}
int InstrRev (char *s, char *p, int os, int sens)
{
int sl, pl, ox;
int (*cmp)(const char *, const char *, size_t );
if (!s || !p) return 0;
sl = strlen(s); pl = strlen(p);
if (os > sl || sl == 0 || pl == 0 || (ox = sl - pl) < 0)
return 0;
if (os <= 0)
os = ox ;
else if(os >= pl)
os = os - pl ;
else
return 0;
cmp = (sens ? strncasecmp : strncmp);
do { if (cmp(s + os , p, pl) == 0)
return os+1;
} while (os--);
return 0;
}
int instr_b(char* mane,char* match,int offset,int sensflag)
{
char *s;
if (!mane || !match || ! *match || offset>(int)strlen(mane)) return 0;
if (sensflag)
s = _stristr_(offset>0 ? mane+offset-1 : mane,match);
else
s = _strstr_(offset>0 ? mane+offset-1 : mane,match);
return s ? (int)(s-mane)+1 : 0;
}
char *MakeLCaseTbl (void)
{
static char tbl[256];
if(!tbl['a'])
{
int i; for (i=0; i < 256; i++)
tbl[i] = (char)(int)tolower(i);
}
return tbl;
}
char *_stristr_(char *String, char *Pattern)
{
int mi=-1;
char *LowCase = MakeLCaseTbl();
while(Pattern[++mi])
{
if(String[mi]==0) return 0;
if(LowCase[(unsigned char)String[mi]]!=LowCase[(unsigned char)Pattern[mi]])
{ String++; mi=-1; }
}
return String;
}
char *_strstr_(char *String, char *Pattern)
{
int mi=-1;
while(Pattern[++mi])
{
if(String[mi]==0) return 0;
if(String[mi]!=Pattern[mi])
{ String++; mi=-1; }
}
return String;
}
int inchr (char *A, char *B)
{
char* C=A;
while(*C)
{
if(*C==*B) return C-A+1;
C++;
}
return 0;
}
double Round (double n, int d)
{
return (floor((n)*pow(10.0,(d))+0.5)/pow(10.0,(d)));
}
bool Exist (char *szFilePath)
{
int retstat;
struct stat sb;
retstat = stat(szFilePath, &sb);
if(retstat != -1)
return TRUE;
return FALSE;
}
int tally (char *szLine, char *szChar, int sensflag)
{
if(!*szChar) return 0;
int mlen = strlen(szChar);
int iCount = 0;
char *p = (sensflag == 0 ? _strstr_(szLine, szChar) : _stristr_(szLine, szChar));
while (p)
{
iCount++;
p+=mlen;
p = (sensflag == 0 ? _strstr_(p, szChar) : _stristr_(p, szChar));
}
return iCount;
}
float rnd (void)
{
return (float)rand()/RAND_MAX;
}
double _MAX_ (double a, double b)
{
if(a>b)
return a;
return b;
}
double _MIN_ (double a, double b)
{
if(a<b)
return a;
return b;
}
void locate (int row,int col,int show,int shape)
{
printf("%c%s%u%s%u%s",27,"[",row,";",col,"H");
// find cursor size/shape function!
}
void cls (void)
{
printf("%s%s%s%s",ESC,"[2J",ESC,"[H");
}
void midstr (char *src, int st, int length, char *rep)
{
int srclen = strlen(src);
if(st>srclen++ || st<1) return;
int replen = strlen(rep);
if(replen < length || length==-1) length=replen;
if((st+length) > srclen) length=srclen-st;
memcpy(&src[st-1],rep,length);
}
DWORD lof (char *FileName)
{
int retstat;
struct stat sb;
retstat = stat(FileName, &sb);
if(retstat != -1)
return sb.st_size;
return 0;
}
char * sziif (bool i, char *a, char *b)
{
if(i) return a;
return b;
}
char *BcxSplitPath (char *FPath, int mask)
{
if(!FPath) return BCX_TmpStr(1);
char *BCX_RetStr=BCX_TmpStr(strlen(FPath));
char tmp[MAX_PATH*4];
_splitpath_(FPath,tmp,&tmp[MAX_PATH],&tmp[MAX_PATH*2],&tmp[MAX_PATH*3]);
if(mask & FDRV) strcat(BCX_RetStr,tmp);
if(mask & FPATH)strcat(BCX_RetStr,&tmp[MAX_PATH]);
if(mask & FNAME)strcat(BCX_RetStr,&tmp[MAX_PATH*2]);
if(mask & FEXT) strcat(BCX_RetStr,&tmp[MAX_PATH*3]);
return BCX_RetStr;
}
void _splitpath_(const char* path, char* drv, char* dir, char* name, char* ext)
{
const char* pend; /* end of processed string */
const char* p; /* search pointer */
const char* s; /* copy pointer */
/* extract drive name */
if (path[0] && path[1]==':') {
if (drv) {
*drv++ = *path++;
*drv++ = *path++;
*drv = 0;
}
} else if (drv)
*drv = 0;
/* search for end of string or stream separator */
for(pend=path; *pend && *pend!=':'; )
pend++;
/* search for begin of file extension */
for(p=pend; p > path && *--p != '\\' && *p!='/'; )
if (*p == '.') {
pend = p;
break;
}
if (ext)
{
s=pend;
do{ *ext++ = *s; } while(*s++);
}
/* search for end of directory name */
for(p=pend; p > path; )
if (*--p == '\\' || *p == '/') {
p++;
break;
}
if (name) {
for(s=p; s<pend; )
*name++ = *s++;
*name = 0;
}
if (dir) {
for(s=path; s<p; )
*dir++ = *s++;
*dir = 0;
}
}
char *_strupr_(char *string)
{
char *s;
if (string)
{
for(s = string; *s; ++s)
*s = toupper(*s);
}
return string;
}
char *_strlwr_(char *string)
{
char *s;
if (string)
{
for (s = string; *s; ++s)
*s = tolower(*s);
}
return string;
}
char * StrToken (char *Source, char *TokenChar, int n)
{
char *BCX_RetStr={0};
char *RetVal;
char *Copy;
int Posn=0;
int Find=0;
int LenSrc=strlen(Source);
RetVal=(char*)calloc(LenSrc+1,1);
Copy=Source;
if(tally(Source,TokenChar)==0)
{
BCX_RetStr=BCX_TmpStr(1);
if(RetVal)free(RetVal);
return BCX_RetStr;
}
if(n==1)
{
BCX_RetStr=BCX_TmpStr(LenSrc);
strcpy(BCX_RetStr,(char*)extract(Source,TokenChar));
if(RetVal)free(RetVal);
return BCX_RetStr;
}
if(n>tally(Source,TokenChar)+1)
{
BCX_RetStr=BCX_TmpStr(1);
if(RetVal)free(RetVal);
return BCX_RetStr;
}
while(*Copy)
{
if(*Copy==TokenChar[0]) Find++;
if(Find==n) break;
Copy++;
Posn++;
}
if(n==tally(Source,TokenChar)+1)
{
Posn=LenSrc;
Copy=Source+Posn;
while(*Copy&&Source[Posn]!=TokenChar[0])
{
Posn--;
Copy--;
}
}
strcpy(RetVal,(char*)mid(Source,1,Posn));
strcpy(RetVal,(char*)mid(RetVal,InstrRev(RetVal,TokenChar)));
BCX_RetStr=BCX_TmpStr(LenSrc);
strcpy(BCX_RetStr,(char*)RemoveStr(RetVal,TokenChar));
if(RetVal)free(RetVal);
return BCX_RetStr;
}
char *iReplace (char *src, char *pat, char *rep)
{
size_t patsz, repsz, tmpsz, delta;
char *strtmp, *p, *q, *r;
if (!pat || !*pat)
{
strtmp = BCX_TmpStr(strlen(src));
if (!strtmp) return NULL;
return strcpy(strtmp, src);
}
repsz = strlen(rep);
patsz = strlen(pat);
for (tmpsz=0, p=src;(q=_stristr_(p,pat))!=0; p=q+patsz)
tmpsz += (size_t) (q - p) + repsz;
tmpsz += strlen(p);
strtmp = BCX_TmpStr(tmpsz);
if (!strtmp) return NULL;
for (r=strtmp,p=src;(q=_stristr_(p,pat))!=0;p=q+patsz)
{
delta = (size_t) (q-p);
memcpy(r,p,delta); r += delta;
strcpy(r,rep); r += repsz;
}
strcpy(r,p);
return strtmp;
}
int containedin(char * Token,char **Contain ,int c)
{
int i=0;
while(Contain[i][0])
{
if(0 == ((c == 0 || c == 2) ? strcmp(Contain[i],Token) : strcasecmp(Contain[i],Token)))
{
return ((c < 2) ? 0 : i);
}
i++;
}
return -1;
}
// ************************************
// User Subs and Functions
// ************************************
int main (int argc, PCHAR* argv)
{
G_argc=argc;
G_argv=argv;
szTmp=(char*)calloc(256+65535,1);
Src=(char*)calloc(256+65535,1);
AbortSrc=(char*)calloc(256+65535,1);
WarnMsg=(char*)calloc(256+65535+1,1);
RmLibs=(char*)calloc(256+32767,1);
static int bitz;
memset(&bitz,0,sizeof(bitz));
ProtoCnt=0;
TranslateSlash=TRUE;
OkayToSend=TRUE;
Use_SingleFile=TRUE;
Use_StartupCode=FALSE;
StartNdx=0;
Use_ExitCode=FALSE;
ExitNdx=0;
*HFile=0;
*CmdLineFileOut=0;
*RmLibs=0;
InMain=TRUE;
TestState=FALSE;
*CmdLineConst=0;
bitz=sizeof(long)*8;
if(command(-1)[0]==0)
{
#if defined (__APPLE__)
printf("%s\n","MBC4: Ported to Mac OSX by Armando Rivera (c) 2009-2018");
#else
printf("%s\n","MBC4: Based on Linux BCX by Mike Henning (c) 2009");
printf("%s%s\n","(c) 2009-2018 Armando Rivera with additional code (c) 2009 John Jacques",LF);
#endif
printf("%s%s%s","Version ",Version," Compiled with ");
// FP3
#if defined __BCPLUSPLUS__// OUTFILE
printf("%s\n","Borland C++");
#elif defined __BORLANDC__
printf("%s\n","Borland C");
#elif defined __POCC__
printf("%s\n","Pelles C");
#elif defined __GNUG__
printf("%s\n","GNU G++");
#else
printf("%s\n","Unknown");
#endif // Main
if(bitz==64)
{
printf("\n");
printf("%s\n","********************");
printf("%s\n","** 64 BIT VERSION **");
printf("%s%s\n","********************",LF);
}
printf("%s%s%s\n"," Usage: ",AppExeName()," infile [.bas] [options]");
printf("%s\n"," [-c] Generate C++ Compatible code");
printf("%s%s%s\n"," [-d] DEFINE a constant ... ex. ",AppExeName()," MyFile -D:MyConst[=SomeValue]");
printf("%s\n"," [-e] Write ERRORS to BCX.ERR file");
printf("%s%s%s\n"," [-f] Output FILENAME... ex. ",AppExeName()," MyFile -f:/MyFiles/MyFile.c");
printf("%s\n"," [-k] KILL the generated BCX generated 'C' file");
printf("%s\n"," [-o] OUTPUT a copy of the generated C file to STDOUT");
printf("%s\n"," [-q] QUIET - No output to screen during translation");
printf("%s\n"," [-s] Show STATUS of translation by line number");
printf("%s\n"," [-w] Enable WARNINGS during translation");
printf("%s%s%s\n"," [-t] TURBO Mode ON w/optional size ... ex. ",AppExeName()," MyFile -t[:1024]");
printf("%s\n"," [-u] Turn UNICODE Support ON");
FreeGlobals();
fflush(stdout);
exit(0);
}
Quiet=FALSE;
{int i;
for(i=2; i<=argc-1; i+=1)
{
if(instr_b(lcase(argv[i]),"-f"))
{
strcpy(CmdLineFileOut,mid(argv[i],4));
}
if(instr_b(lcase(argv[i]),"-d"))
{
strcpy(CmdLineConst, join(3,CmdLineConst,mid(argv[i],4),chr(1)));
}
if(str_cmp(lcase(argv[i]),"-c")==0)
{
UseCpp=TRUE;
}
if(str_cmp(lcase(argv[i]),"-e")==0)
{
ErrFile=TRUE;
}
if(str_cmp(lcase(argv[i]),"-q")==0)
{
Quiet=TRUE;
}
if(str_cmp(lcase(argv[i]),"-k")==0)
{
KillCFile=TRUE;
}
if(str_cmp(lcase(argv[i]),"-o")==0)
{
ReDirect=TRUE;
}
if(str_cmp(lcase(argv[i]),"-s")==0)
{
ShowStatus=TRUE;
}
if(str_cmp(lcase(argv[i]),"-w")==0)
{
TestState=TRUE;
}
if(instr_b(lcase(argv[i]),"-t"))
{
Use_Turbo=TRUE;
TurboSize=VAL(mid(argv[i],4));
if(TurboSize!=0)
{
if((TurboSize&(TurboSize-1))!=0)
{
TurboSize=512;
Warning("Invalid $Turbo size - defaulting to 512");
}
}
else
{
TurboSize=512;
}
}
}
}
if(ShowStatus)
{
cls();
}
if(!Quiet)
{
cls();
printf("%s%s\n","MBC Version ",Version);
#if defined (__APPLE__)
IsApple=TRUE;
printf("%s%s\n","MBC4: Ported to Mac OSX by Armando Rivera (c) 2009-2018",LF);
#else
printf("%s\n","MBC4: Based on Linux BCX by Mike Henning (c) 2009");
printf("%s%s\n","(c) 2009-2018 Armando Rivera with additional code (c) 2009 John Jacques",LF);
#endif
if(bitz==64)
{
printf("\n");
printf("%s\n","********************");
printf("%s\n","** 64 BIT VERSION **");
printf("%s%s\n","********************",LF);
}
}
if(inchr(command(1),"."))
{
strcpy(Cmd,command(1));
}
else
{
if(Exist(join(2,command(1),".bas")))
{
strcpy(Cmd, join(2,command(1),".bas"));
}
else if(Exist(join(2,command(1),".BAS")))
{
strcpy(Cmd, join(2,command(1),".BAS"));
}
}
if(!Exist(Cmd))
{
printf("\n");
printf("%s%s\n","FILE NOT FOUND: ",command(1));
FreeGlobals();
fflush(stdout);
exit(0);
}
strcpy(FileIn,Cmd);
if(CmdLineFileOut[0]==0)
{
strcpy(FileOut, join(2,left(Cmd,InstrRev(Cmd,".",0)-1),".cc"));
}
else
{
strcpy(FileOut,CmdLineFileOut);
}
strcpy(FileErr, join(2,left(Cmd,InstrRev(Cmd,".",0)-1),".ERR"));
if(Exist(FileErr))
{
remove (FileErr);
}
strcpy(prcFile,TempFileName(tempdir(),"prc"));
strcpy(udtFile,TempFileName(tempdir(),"udt"));
strcpy(datFile,TempFileName(tempdir(),"dat"));
strcpy(cstFile,TempFileName(tempdir(),"cst"));
strcpy(ovrFile,TempFileName(tempdir(),"ovr"));
strcpy(hdrFile,TempFileName(tempdir(),"hdr"));
strcpy(setFile,TempFileName(tempdir(),"set"));
strcpy(enuFile,TempFileName(tempdir(),"enu"));
if((SourceFile=fopen(FileIn,"r"))==0)
{
fprintf(stderr,"Can't open file %s\n",FileIn);
exit(1);
}
if((FP2=fopen(FileOut,"w"))==0)
{
fprintf(stderr,"Can't open file %s\n",FileOut);
exit(1);
}
Outfile=FP2;
if((FP3=fopen(prcFile,"w"))==0)
{
fprintf(stderr,"Can't open file %s\n",prcFile);
exit(1);
}
if((FP4=fopen(udtFile,"w"))==0)
{
fprintf(stderr,"Can't open file %s\n",udtFile);
exit(1);
}
if((FP5=fopen(datFile,"w"))==0)
{
fprintf(stderr,"Can't open file %s\n",datFile);
exit(1);
}
if((FP6=fopen(cstFile,"w"))==0)
{
fprintf(stderr,"Can't open file %s\n",cstFile);
exit(1);
}
if((FP7=fopen(hdrFile,"w"))==0)
{
fprintf(stderr,"Can't open file %s\n",hdrFile);
exit(1);
}
if((FP8=fopen(ovrFile,"w"))==0)
{
fprintf(stderr,"Can't open file %s\n",ovrFile);
exit(1);
}
if((FP9=fopen(setFile,"w"))==0)
{
fprintf(stderr,"Can't open file %s\n",setFile);
exit(1);
}
if((FP11=fopen(enuFile,"w"))==0)
{
fprintf(stderr,"Can't open file %s\n",enuFile);
exit(1);
}
ModuleNdx=1;
strcpy(Modules[ModuleNdx],FileIn);
ModuleLineNos[ModuleNdx]=0;
EmitProlog();
ClearIfThenStacks();
EmitCmdLineConst();
AddGlobal("G_argv",vt_PCHAR,0,"",1,0,0,0);
AddGlobal("G_argc",vt_INTEGER,0,"",0,0,0,0);
READSRCLINE:;
while(!EoF(SourceFile)||SplitCnt)
{
if(SplitCnt==0)
{
Src[0]=0;
AR_fgets_retval=fgets(Src,65535,SourceFile);
if(Src[strlen(Src)-1]==10)Src[strlen(Src)-1]=0;
ModuleLineNos[ModuleNdx]++;
StripCode(Src);
if(*Src==0)
{
continue;
}
if(JoinLines(Src)==1)
{
continue;
}
if(inchr(Src,"["))
{
BracketHandler(Src,0);
}
if(SplitLines(Src))
{
strcpy(Src,SplitStk[++SplitCur]);
}
}
else
{
strcpy(Src,SplitStk[++SplitCur]);
}
if(SplitCur==SplitCnt)
{
SplitCur=SplitCnt=0;
}
if(*Src==0)
{
continue;
}
strcpy(AbortSrc,Src);
if(TrcFlag&&InFunc)
{
if(!iMatchLft(Src,"$trace"))
{
if(!iMatchLft(Src,"end ")&&instr_b(Src,"FUNCTION",0,1)==0)
{
fprintf(Outfile,"%s%s%s%s%s%s\n","// [",trim(Modules[ModuleNdx])," - ",trim(str(ModuleLineNos[ModuleNdx])),"] ",Src);
strcpy(Z,trim(Modules[ModuleNdx]));
strcpy(Z,replace(Z,"\\","\\\\"));
strcpy(Z, join(5," ",Z," - ",str(ModuleLineNos[ModuleNdx])," \\n"));
strcpy(Z, join(3,"printf(",enc(Z),");"));
fprintf(Outfile,"%s\n",Z);
}
}
}
if(SrcFlag)
{
if(!iMatchLft(Src,"$sourc")&&*Src!=33)
{
fprintf(Outfile,"%s%s%s%s%s%s\n","// [",trim(Modules[ModuleNdx])," - ",trim(str(ModuleLineNos[ModuleNdx])),"] ",Src);
}
}
if(ShowStatus)
{
locate (2,1,0);
printf("%s%s%s%d\n","Processing Module: ",trim(Modules[ModuleNdx])," - Line:",(int)ModuleLineNos[ModuleNdx]);
}
if(Src[0]==33)
{
Src[0]=32;
fprintf(Outfile,"%s\n",Src);
*Src=0;
}
if(*Src==0)
{
continue;
}
int di;
di=Directives();
if(di==0)
{
goto READNEXTLINE;
}
if(di==1)
{
goto READSRCLINE;
}
if(iMatchLft(Src,"set "))
{
ProcessSetCommand(0);
}
if(iMatchLft(Src,"sharedset "))
{
ProcessSetCommand(1);
}
PassOne=TRUE;
CheckParQuotes();
if(SpecialCaseHandler(Src))
{
continue;
}
Parse(Src);
PassOne=FALSE;
if(Ndx)
{
Emit();
}
READNEXTLINE:;
}
if(CmdLineConst[0]>0)
{
strcpy(Src, join(2,"CONST ",CmdLineConst));
Parse(Src);
Emit();
*CmdLineConst=0;
}
if(TestForBcxIni==FALSE)
{
TestForBcxIni=TRUE;
strcpy(szFile, join(2,curdir(),"\\bcx.ini"));
if(!Exist(szFile))
{
strcpy(szFile, join(2,AppExePath(),"bcx.ini"));
}
if(Exist(szFile))
{
PushFileIO();
if((SourceFile=fopen(szFile,"r"))==0)
{
fprintf(stderr,"Can't open file %s\n",szFile);
exit(1);
}
strcpy(Modules[++ModuleNdx],szFile);
ModuleLineNos[ModuleNdx]=0;
goto READSRCLINE;
}
}
fflush(Outfile);
if(FPtrNdx)
{
PopFileIO();
goto READSRCLINE;
}
if(Use_GenFree&&GlobalDynaCnt)
{
MakeFreeGlobals();
}
ExportInternalConst();
EmitEpilog();
CloseAll();
AddProtos();
DeclareVariables();
AddFuncs();
CloseAll();
if(UseCpp&&str_cmp(CmdLineFileOut,"")==0)
{
strcpy(szTmp, join(2,extract(FileOut,"."),".cpp"));
remove (szTmp);
rename (FileOut,szTmp);
strcpy(FileOut,szTmp);
}
if(Use_Osx&&str_cmp(CmdLineFileOut,"")==0)
{
strcpy(szTmp, join(2,extract(FileOut,"."),".mm"));
remove (szTmp);
rename (FileOut,szTmp);
strcpy(FileOut,szTmp);
}
if((FP1=fopen(FileOut,"r"))==0)
{
fprintf(stderr,"Can't open file %s\n",FileOut);
exit(1);
}
if((FP2=fopen(hdrFile,"r"))==0)
{
fprintf(stderr,"Can't open file %s\n",hdrFile);
exit(1);
}
if((FP3=fopen("$temp$","w"))==0)
{
fprintf(stderr,"Can't open file %s\n","$temp$");
exit(1);
}
DoCountLines=TRUE;
fprintf(FP3,"%s\n","// *********************************************************************");
fprintf(FP3,"%s%s%s\n","// Created with MBC (V) ",Version,"Ported to OSX by Armando Rivera");
fprintf(FP3,"%s\n","// Ported from BCX32 BASIC To C/C++ Translator (V) 5.12");
fprintf(FP3,"%s\n","// BCX (c) 1999 - 2018 by Kevin Diggins");
fprintf(FP3,"%s\n","// LinuxBC (c) 2009 by Mike Henning ");
fprintf(FP3,"%s\n","// MBC (c) 2009 - 2018 by Armando Rivera");
fprintf(FP3,"%s\n","// *********************************************************************");
fprintf(FP3,"%s\n","// Translated for compiling with the g++ Compiler");
if(UseCpp)
{
fprintf(FP3,"%s\n","// g++ -Wformat -D_FORTIFY_SOURCE=2 -Wno-write-strings $FILE$.cpp -ldl -o $FILE$");
}
else
{
fprintf(FP3,"%s\n","// g++ -Wformat -D_FORTIFY_SOURCE=2 -Wno-write-strings $FILE$.cc -ldl -o $FILE$");
}
fprintf(FP3,"%s\n","// *********************************************************************");
if(NoRT==FALSE)
{
if(Use_Osx)
{
fprintf(FP3,"%s\n","#import <Cocoa/Cocoa.h>");
}
/*****2010-11-24AddedWxCFORWXCONSOLEApps-AIR*****/;
if(Use_Wx||Use_WxC)
{
fprintf(FP3,"%s\n","// WXWIDGETS HEADER FILES //");
fprintf(FP3,"%s\n","#include <wx/wx.h>");
fprintf(FP3,"%s\n","#include <wx/process.h>");
fprintf(FP3,"%s\n","#include <wx/txtstrm.h>");
fprintf(FP3,"%s\n","#include <wx/msgdlg.h>");
fprintf(FP3,"%s\n","#include <wx/stdpaths.h>");
fprintf(FP3,"%s\n","#include <wx/event.h>");
fprintf(FP3,"%s\n","// ******************* //");
fprintf(FP3,"%s\n","");
}
if(Use_Gtk)
{
fprintf(FP3,"%s\n","#include <gtk/gtk.h>");
}
if(Use_Glib)
{
fprintf(FP3,"%s\n","#include <glib.h>");
}
fprintf(FP3,"%s\n","#include <stdbool.h>");
fprintf(FP3,"%s\n","#include <ctype.h>");
fprintf(FP3,"%s\n","#include <math.h>");
fprintf(FP3,"%s\n","#include <stdio.h>");
fprintf(FP3,"%s\n","#include <iostream>");
fprintf(FP3,"%s\n","#include <fstream>");
fprintf(FP3,"%s\n","#include <string.h>");
fprintf(FP3,"%s\n","#include <stddef.h>");
fprintf(FP3,"%s\n","#include <stdlib.h>");
fprintf(FP3,"%s\n","#include <setjmp.h>");
fprintf(FP3,"%s\n","#include <time.h>");
fprintf(FP3,"%s\n","#include <stdarg.h>");
fprintf(FP3,"%s\n","#include <dirent.h>");
fprintf(FP3,"%s\n","#include <sys/types.h>");
fprintf(FP3,"%s\n","#include <sys/stat.h>");
fprintf(FP3,"%s\n","#include <sys/wait.h>");
fprintf(FP3,"%s\n","#include <unistd.h>");
fprintf(FP3,"%s\n","#include <dlfcn.h>");
#if defined (__APPLE__)
fprintf(FP3,"%s\n","#include <libproc.h>");
#endif
if(UseCpp)
{
fprintf(FP3,"%s\n","#include <iostream>");
fprintf(FP3,"%s\n","#include <fstream>");
}
if(Use_Instat)
{
Use_Keypress=TRUE;
fprintf(FP3,"%s\n","#include <fcntl.h>");
}
if(Use_Keypress)
{
fprintf(FP3,"%s\n","#include <term.h>");
}
if(Use_Socket)
{
fprintf(FP3,"%s\n","#include <sys/socket.h>");
fprintf(FP3,"%s\n","#include <netinet/in.h>");
fprintf(FP3,"%s\n","#include <netdb.h>");
fprintf(FP3,"%s\n","#include <errno.h>");
fprintf(FP3,"%s\n","#include <arpa/inet.h>");
}
if(Use_RegEx)
{
fprintf(FP3,"%s\n","#include <regex.h>");
}
fprintf(FP3,"%s\n","");
EmitCompilerDefines();
}
while(!EoF(FP2))
{
Z[0]=0;
AR_fgets_retval=fgets(Z,65535,FP2);
if(Z[strlen(Z)-1]==10)Z[strlen(Z)-1]=0;
fprintf(FP3,"%s\n",Z);
}
char Lastlyne[2048];
*Lastlyne=0;
while(!EoF(FP1))
{
static int bMainOut=0;
Z[0]=0;
AR_fgets_retval=fgets(Z,65535,FP1);
if(Z[strlen(Z)-1]==10)Z[strlen(Z)-1]=0;
if(iMatchLft(Lastlyne,"#if"))
{
if(iMatchLft(Z,"#endif"))
{
*Lastlyne=0;
continue;
}
else
{
fprintf(FP3,"%s\n",Lastlyne);
}
}
strcpy(Lastlyne,Z);
if(iMatchLft(Lastlyne,"#if"))
{
continue;
}
fprintf(FP3,"%s\n",Z);
if(bMainOut)
{
continue;
}
if(str_cmp(left(ltrim(Z),8),"int main")==0)
{
while(str_cmp(trim(Z),"{")!=0)
{
Z[0]=0;
AR_fgets_retval=fgets(Z,65535,FP1);
if(Z[strlen(Z)-1]==10)Z[strlen(Z)-1]=0;
fprintf(FP3,"%s\n",Z);
}
if(Use_StartupCode)
{
fprintf(FP3,"%s%s\n",Scoot,"int BCX_SUCode = BCX_StartupCode_(); // execute user's startup code");
}
if(Use_ExitCode)
{
fprintf(FP3,"%s%s\n",Scoot,"int BCX_EXCode = BCX_ExitCode_(); // Prepare for user's exit code");
}
bMainOut++;
}
}
DoCountLines=FALSE;
CloseAll();
remove (hdrFile);
remove (FileOut);
rename ("$temp$",FileOut);
if(ShowStatus)
{
locate (2,1,1);
}
if(!Quiet)
{
LinesRead+=(ModuleLineNos[1]);
Elapsed=Round((float)clock()/(float)CLOCKS_PER_SEC,2);
printf("%s%d%s%d%s","[Lines In:",(int)LinesRead,"] [Lines Out:",(int)gLinesWritten,"] ");
printf("%s%d%s%.7G%s\n","[Statements:",(int)Statements,"] [Time:",(float)Elapsed," sec's]");
strcpy(Z, join(4,"BCX translated ",RemoveStr(FileIn," ")," to ",RemoveStr(FileOut," ")));
printf("%s\n",Z);
}
PostProcess();
if(WarnMsg[0]>0)
{
printf("%s%s%s\n","Warnings! :",CRLF,WarnMsg);
}
if(KillCFile)
{
remove (FileOut);
}
FreeGlobals();
return 0;
}
void EmitCmdLineConst (void)
{
if(CmdLineConst[0]>0)
{
static FILE* Ftmp;
fprintf(FP7,"%s\n","");
fprintf(FP7,"%s\n","// ***************************************************");
fprintf(FP7,"%s\n","// Commandline Defines");
fprintf(FP7,"%s\n","// ***************************************************");
fprintf(FP7,"%s\n","");
Ftmp=FP6;
FP6=FP7;
{int i;
for(i=1; i<=tally(CmdLineConst,chr(1)); i+=1)
{
strcpy(Src,StrToken(CmdLineConst,chr(1),i));
if(Src[0]==0)
{
break;
}
strcpy(Src, join(2,"CONST ",Src));
Parse(Src);
Emit();
}
}
*CmdLineConst=0;
FP6=Ftmp;
fprintf(FP7,"%s\n","");
}
}
void EmitCompilerDefines (void)
{
fprintf(FP3,"%s\n","");
fprintf(FP3,"%s\n","// ***************************************************");
fprintf(FP3,"%s\n","// Compiler Defines");
fprintf(FP3,"%s\n","// ***************************************************");
fprintf(FP3,"%s%s\n"," #define C_EXPORT extern ",enc("C"));
fprintf(FP3,"%s%s\n"," #define C_IMPORT extern ",enc("C"));
fprintf(FP3,"%s\n","");
fprintf(FP3,"%s\n","#ifndef stat");
fprintf(FP3,"%s\n"," #define lstat stat");
fprintf(FP3,"%s\n","#endif");
fprintf(FP3,"%s\n","#ifndef _fcloseall");
fprintf(FP3,"%s\n"," #define _fcloseall _fcloseall");
fprintf(FP3,"%s\n","#endif");
fprintf(FP3,"%s\n","#ifndef HWND");
fprintf(FP3,"%s\n"," #define HWND GHWND");
fprintf(FP3,"%s\n","#endif");
fprintf(FP3,"%s\n","#ifndef MAX_PATH");
fprintf(FP3,"%s\n"," #define MAX_PATH 2048");
fprintf(FP3,"%s\n","#endif");
fprintf(FP3,"%s\n","#ifndef CALLBACK");
fprintf(FP3,"%s\n"," #define CALLBACK");
fprintf(FP3,"%s\n","#endif");
fprintf(FP3,"%s\n","typedef unsigned int HINSTANCE;");
fprintf(FP3,"%s\n","typedef void* LPVOID;");
fprintf(FP3,"%s\n","typedef char* PCHAR;");
fprintf(FP3,"%s\n","typedef unsigned char BYTE;");
fprintf(FP3,"%s\n","typedef unsigned int UINT;");
fprintf(FP3,"%s\n","typedef unsigned char UCHAR;");
fprintf(FP3,"%s\n","typedef unsigned char* PUCHAR;");
fprintf(FP3,"%s\n","typedef unsigned long ULONG;");
fprintf(FP3,"%s\n","typedef unsigned long* ULONG_PTR;");
fprintf(FP3,"%s\n","typedef unsigned long DWORD;");
fprintf(FP3,"%s\n","");
fprintf(FP3,"%s\n","#ifndef TRUE");
fprintf(FP3,"%s\n"," #define TRUE 1");
fprintf(FP3,"%s\n","#endif");
fprintf(FP3,"%s\n","");
fprintf(FP3,"%s\n","#ifndef FALSE");
fprintf(FP3,"%s\n"," #define FALSE 0");
fprintf(FP3,"%s\n","#endif");
if(!Use_Osx)
{
fprintf(FP3,"%s\n","#define BOOL bool");
}
fprintf(FP3,"%s\n","");
if(UseCpp)
{
fprintf(FP3,"%s\n","#define println(a) (std::cout << a << std::endl)");
fprintf(FP3,"%s\n"," typedef std::string CSTRING;");
fprintf(FP3,"%s\n"," typedef std::fstream CFILE;");
}
}
void MakeFreeGlobals (void)
{
strcpy(Src,"SUB FreeGlobals");
PassOne=1;
Parse(Src);
Emit();
while(GlobalDynaCnt)
{
fprintf(Outfile,"%s%s\n"," ",GlobalDynaStr[GlobalDynaCnt]);
GlobalDynaCnt--;
}
strcpy(Src,"END SUB");
PassOne=1;
Parse(Src);
Emit();
}
void ProcessSetCommand (int GS)
{
int i;
int ii;
int j;
int SetString=0;
char CVar[2048];
int vt;
static FILE *SaveFP;
memset(&SaveFP,0,sizeof(SaveFP));
SaveFP=Outfile;
if(!InFunc)
{
Outfile=FP9;
}
if(inchr(Src,"$")&&tally(Src,"[")>1)
{
strcpy(Src,strim(Src));
strcpy(Src,IRemoveStr(Src,"as string"));
strcpy(Src,IRemoveStr(Src,"as char"));
strcat(Src," AS char");
}
strcat(Src,"=");
PassOne=1;
Parse(Src);
*Tipe=0;
for(i=1; i<=Ndx; i+=1)
{
if(iMatchWrd(Stk[i],"as"))
{
strcpy(Tipe,Stk[i+1]);
*Stk[i]=0;
*Stk[i+1]=0;
break;
}
}
if(Tipe[0]==0)
{
strcpy(szTmp,Stk[2]);
SetString=DataType(Stk[2]);
j=SetString;
VarCode.Method=mt_ProcessSetCommand;
strcpy(VarCode.Token,szTmp);
VarCode.VarNo=j;
GetVarCode( &VarCode);
if(GS)
{
fprintf(Outfile,"%s%s",Scoot,RemoveStr(VarCode.StaticOut,"static "));
}
else
{
fprintf(Outfile,"%s%s",Scoot,VarCode.StaticOut);
}
char lszTmp[65535];
*lszTmp=0;
strcpy(CVar,Clean(Stk[2]));
ValidVar(CVar);
vt=DataType(Stk[2]);
for(i=3; i<=Ndx; i+=1)
{
strcat(lszTmp,Stk[i]);
}
if(vt==vt_STRVAR&&str_cmp(lszTmp,"")!=0)
{
strcat(lszTmp,"[65535]");
}
if(!InFunc)
{
AddGlobal(CVar,vt,0,lszTmp,0,0,0,1);
}
else
{
AddLocal(CVar,vt,0,lszTmp,0,0,1);
}
}
else
{
strcpy(CVar,Clean(Stk[2]));
if(GS)
{
fprintf(Outfile,"%s%s%s%s",Scoot,Tipe," ",CVar);
}
else
{
fprintf(Outfile,"%s%s%s%s%s",Scoot,"static ",Tipe," ",CVar);
}
char DimType[2048];
int IsPointer;
int id;
strcpy(DimType,RemoveStr(Tipe,"*"));
GetTypeInfo(Tipe, &IsPointer, &id, &vt);
if(vt==vt_STRVAR)
{
strcat(DimType,"[65535]");
}
if(!InFunc)
{
AddGlobal(CVar,vt,id,DimType,IsPointer,0,0,1);
}
else
{
AddLocal(CVar,vt,id,DimType,IsPointer,0,1);
}
}
i=2;
j=0;
for(;;)
{
i++;
if(str_cmp(Stk[i],"=")==0)
{
j=1;
}
if(SetString==vt_STRVAR&&j==1)
{
fprintf(Outfile,"%s","[65535]=");
}
else
{
fprintf(Outfile,"%s",Stk[i]);
}
if(str_cmp(Stk[i],"=")==0)
{
break;
}
if(i==Ndx)
{
break;
}
}
fprintf(Outfile,"%s\n","");
fprintf(Outfile,"%s\n","{");
while(!EoF(SourceFile))
{
Src[0]=0;
AR_fgets_retval=fgets(Src,65535,SourceFile);
if(Src[strlen(Src)-1]==10)Src[strlen(Src)-1]=0;
ModuleLineNos[ModuleNdx]++;
StripCode(Src);
if(JoinLines(Src)==1)
{
continue;
}
PassOne=TRUE;
XParse(Src);
PassOne=FALSE;
TokenSubstitutions();
if(iMatchLft(Src,"end "))
{
break;
}
if(strlen(Src))
{
fprintf(Outfile,"%s"," ");
for(ii=1; ii<=Ndx; ii+=1)
{
fprintf(Outfile,"%s",Clean(Stk[ii]));
}
fprintf(Outfile,"%s\n","");
}
}
fprintf(Outfile,"%s\n","};\n");
*Src=0;
Outfile=SaveFP;
}
int Directives (void)
{
char lszTmp[2048];
int i;
char COutputFile[2048];
if(*Src==35||*Src==36)
{
strcpy(Z,rtrim(lcase(left(Src,6))));
for(;;)
{
if(str_cmp(Z,"$proje")==0)
{
NoRT=TRUE;
*Src=0;
return 0;
}
if(str_cmp(Z,"$accel")==0)
{
XParse(Src);
strcpy(Accelerator,RemoveStr(Stk[2],DQ));
*Src=0;
return 0;
}
if(str_cmp(Z,"$bcxve")==0)
{
strcpy(Src,trim(mid(Src,12)));
strcpy(Src,RemoveStr(Src,DQ));
if(str_cmp(lcase(Version),lcase(Src))==-1)
{
Abort(join(10,CRLF,"Your Translator needs updating.",CRLF,"This program ",enc(Modules[ModuleNdx])," requires BCX Version: ",Src," or later.",CRLF,CRLF));
}
else
{
printf("%s\n","");
printf("%s%s\n","Program written for BCX Version ",Src);
printf("%s\n","");
}
return 0;
}
if(str_cmp(Z,"$compi")==0)
{
PassOne=1;
XParse(Src);
PassOne=0;
strcpy(Compiler,Stk[2]);
*Src=0;
return 0;
}
if(str_cmp(Z,"$execo")==0)
{
static char SrcExt[2048];
memset(&SrcExt,0,sizeof(SrcExt));
PassOne=1;
XParse(Src);
PassOne=0;
XitCount++;
if(UseCpp)
{
strcpy(SrcExt,".cpp");
}
else if(Use_Osx)
{
strcpy(SrcExt,".mm");
}
else
{
strcpy(SrcExt,".cc");
}
if(MakeDLL)
{
strcpy(Xit[XitCount], join(7,"g++ -Wformat -D_FORTIFY_SOURCE=2 -Wno-write-strings $FILE$",SrcExt," -ldl ",LD_FLAGS,SPC,Stk[2]," -o lib$FILE$.so"));
*SrcExt=0;
*Src=0;
return 0;
}
if(Use_IOS)
{
static char IOS_COMPILER[2048];
memset(&IOS_COMPILER,0,sizeof(IOS_COMPILER));
strcpy(IOS_COMPILER,"/Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/g++");
if(strlen(Stk[2])>0)
{
strcpy(Xit[XitCount], join(8,IOS_COMPILER," -Wformat -D_FORTIFY_SOURCE=2 -Wno-write-strings $FILE$",SrcExt," -ldl ",LD_FLAGS,SPC,Stk[2]," -o $FILE$"));
}
else
{
strcpy(Xit[XitCount], join(6,IOS_COMPILER," -Wformat -D_FORTIFY_SOURCE=2 -Wno-write-strings $FILE$",SrcExt," -ldl ",LD_FLAGS," -o $FILE$"));
}
*SrcExt=0;
*Src=0;
return 0;
}
if(strlen(Stk[2])>0)
{
strcpy(Xit[XitCount], join(7,"g++ -Wformat -D_FORTIFY_SOURCE=2 -Wno-write-strings $FILE$",SrcExt," -ldl ",LD_FLAGS,SPC,Stk[2]," -o $FILE$"));
}
else
{
strcpy(Xit[XitCount], join(5,"g++ -Wformat -D_FORTIFY_SOURCE=2 -Wno-write-strings $FILE$",SrcExt," -ldl ",LD_FLAGS," -o $FILE$"));
}
*SrcExt=0;
*Src=0;
return 0;
}
if(str_cmp(Z,"$exest")==0)
{
PassOne=1;
XParse(Src);
PassOne=0;
XitCount++;
if(IsApple)
{
strcpy(Xit[XitCount],"strip $FILE$");
}
else
{
strcpy(Xit[XitCount],"strip -s -R .comment -R .note -R .note.ABI-tag $FILE$");
}
*Src=0;
return 0;
}
if(str_cmp(Z,"$genfr")==0)
{
Use_GenFree=TRUE;
*Src=0;
return 0;
}
if(str_cmp(Z,"$osx")==0)
{
Use_Osx=TRUE;
strcpy(LD_FLAGS,join(2,LD_FLAGS," -fobjc-arc -framework Cocoa"));
return 0;
}
if(str_cmp(Z,"$ios")==0)
{
#if !defined __APPLE__
Abort(join(3,CRLF,"The $IOS Directive REQUIRES an Apple OSX Operating System",CRLF));
#endif
Use_IOS=TRUE;
PassOne=1;
XParse(Src);
PassOne=0;
strcpy(LD_FLAGS,join(2,LD_FLAGS," -arch armv6 -arch armv7 -mthumb -isysroot /Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS4.2.sdk -framework Foundation -framework CoreFoundation"));
return 0;
}
if(str_cmp(Z,"$gtk")==0)
{
Use_Gtk=TRUE;
strcpy(LD_FLAGS,join(2,LD_FLAGS," $(pkg-config --libs --cflags gtk+-2.0)"));
return 0;
}
if(str_cmp(Z,"$ldfla")==0)
{
strcpy(LD_FLAGS,join(2,LD_FLAGS,remain(Src," ")));
return 0;
/*****2010-11-24AddedWxCFORWXCONSOLEApps-AIR*****/;
break;
}
if(str_cmp(Z,"$wxc")==0)
{
Use_WxC=UseCpp=NoMain=TRUE;
strcpy(LD_FLAGS,join(2,LD_FLAGS," $(wx-config --libs --cppflags)"));
return 0;
}
if(str_cmp(Z,"$wx")==0)
{
Use_Wx=UseCpp=NoMain=TRUE;
strcpy(LD_FLAGS,join(2,LD_FLAGS," $(wx-config --libs --cppflags)"));
return 0;
}
if(str_cmp(Z,"$glib")==0)
{
Use_Glib=TRUE;
strcpy(LD_FLAGS,join(2,LD_FLAGS," $(pkg-config --libs --cflags glib-2.0)"));
return 0;
}
if(str_cmp(Z,"$noini")==0)
{
*Src=0;
TestForBcxIni=TRUE;
return 0;
}
if(str_cmp(Z,"$linke")==0)
{
PassOne=1;
XParse(Src);
PassOne=0;
strcpy(Linker,Stk[2]);
*Src=0;
return 0;
}
if(str_cmp(Z,"$onexi")==0)
{
PassOne=1;
XParse(Src);
PassOne=0;
XitCount++;
strcpy(Xit[XitCount],Stk[2]);
*Src=0;
return 0;
}
if(str_cmp(Z,"$onent")==0)
{
PassOne=1;
XParse(Src);
PassOne=0;
EntryCnt++;
strcpy(Entry[EntryCnt],Stk[2]);
*Src=0;
return 0;
}
if(str_cmp(Z,"$pack")==0 || str_cmp(Z,"$pack(")==0)
{
strcpy(Src,mid(Src,6));
fprintf(FP4,"%s%s\n","#pragma pack ",ltrim(Src));
*Src=0;
return 0;
}
if(str_cmp(Z,"$nodll")==0)
{
NoDllMain=TRUE;
*Src=0;
return 0;
}
if(str_cmp(Z,"$pelle")==0)
{
*Src=0;
return 0;
}
if(str_cmp(Z,"$stdca")==0)
{
UseStdCall=TRUE;
*Src=0;
return 0;
}
if(str_cmp(Z,"$iprin")==0)
{
if(instr_b(lcase(Src),"_on"))
{
TranslateSlash=TRUE;
}
else
{
TranslateSlash=FALSE;
}
*Src=0;
return 0;
}
if(str_cmp(Z,"$nomai")==0)
{
NoMain=TRUE;
*Src=0;
return 0;
}
if(str_cmp(Z,"$test")==0)
{
TestState=!TestState;
*Src=0;
return 0;
}
if(str_cmp(Z,"$typed")==0)
{
fprintf(FP7,"%s%s%s\n","typedef ",remain(Src," "),";");
*Src=0;
return 0;
}
if(str_cmp(Z,"$resou")==0)
{
static char resAlias[2048];
memset(&resAlias,0,sizeof(resAlias));
static char resFile[2048];
memset(&resFile,0,sizeof(resFile));
Use_Embed=TRUE;
PassOne=1;
XParse(Src);
PassOne=0;
EntryCnt++;
strcpy(Entry[EntryCnt], join(5,"ld -r -b binary ",Stk[2]," -o ",Stk[2],".o"));
strcpy(Stk[2],replace(Stk[2],".","_"));
strcpy(resFile,RemoveStr(Stk[2],DQ));
strcpy(resAlias,RemoveStr(Stk[3],DQ));
AddGlobal(join(3,"_binary_",resFile,"_start"),vt_INTEGER,0,"",0,0,1,0);
AddGlobal(join(3,"_binary_",resFile,"_size"),vt_INTEGER,0,"",0,0,1,0);
strcpy(Src, join(5,"CONST ",resAlias,"= &_binary_",resFile,"_start"));
Parse(Src);
Emit();
strcpy(Src, join(5,"CONST ",resAlias,"_SIZE = (int)&_binary_",resFile,"_size"));
Parse(Src);
Emit();
*Src=0;
return 0;
}
if(str_cmp(Z,"$turbo")==0)
{
strcpy(Src,ltrim(mid(Src,7)));
if(*Src!=0)
{
TurboSize=VAL(Src);
if((TurboSize&(TurboSize-1))!=0)
{
TurboSize=512;
Warning("Invalid $Turbo size - defaulting to 512");
}
}
else
{
TurboSize=512;
}
Use_Turbo=TRUE;
*Src=0;
return 0;
}
if(str_cmp(Z,"$sourc")==0)
{
SrcFlag=!SrcFlag;
*Src=0;
return 0;
}
if(str_cmp(Z,"$fssta")==0)
{
Use_Static=!Use_Static;
*Src=0;
return 0;
}
if(str_cmp(Z,"$trace")==0)
{
TrcFlag=!TrcFlag;
*Src=0;
return 0;
}
if(str_cmp(Z,"$inclu")==0 || str_cmp(Z,"$modul")==0)
{
char orgfileName[2048];
strcpy(szFile,trim(RemoveStr(mid(Src,9),DQ)));
strcpy(orgfileName,szFile);
if(str_cmp(left(szFile,1),"<")==0)
{
strcpy(szFile,mid(szFile,2,strlen(szFile)-2));
strcpy(szFile, join(2,Environ("BCXLIB"),szFile));
}
if(!Exist(szFile))
{
strcpy(szFile,BcxSplitPath(szFile,FNAME|FEXT));
strcpy(szFile, join(2,BcxSplitPath(FileIn,FDRV|FPATH),szFile));
}
if(!Exist(szFile))
{
Abort(join(2,"Unable to locate ",orgfileName));
}
PushFileIO();
if((SourceFile=fopen(szFile,"r"))==0)
{
fprintf(stderr,"Can't open file %s\n",szFile);
exit(1);
}
strcpy(Modules[++ModuleNdx],szFile);
ModuleLineNos[ModuleNdx]=0;
return 1;
}
if(str_cmp(Z,"$try")==0)
{
fprintf(Outfile,"%s\n","try {");
*Src=0;
return 0;
}
if(str_cmp(Z,"$throw")==0)
{
strcpy(szTmp,mid(Src,8));
if(szTmp[0]==0)
{
strcpy(szTmp,enc("An Exception has occured!"));
}
fprintf(Outfile,"%s%s%s%s\n",Scoot,"throw ",szTmp,";");
*Src=0;
return 0;
}
if(str_cmp(Z,"$catch")==0)
{
strcpy(szTmp,mid(Src,8));
if(szTmp[0]==0)
{
strcpy(szTmp,"char *str");
}
fprintf(Outfile,"%s\n","}");
fprintf(Outfile,"%s%s%s\n","catch (",szTmp,")");
fprintf(Outfile,"%s\n","{");
*Src=0;
return 0;
}
if(str_cmp(Z,"$endtr")==0)
{
fprintf(Outfile,"%s\n","}");
*Src=0;
return 0;
}
if(str_cmp(Z,"$endna")==0)
{
InNameSpace--;
BumpDown();
fprintf(Outfile,"%s%s\n",Scoot,"}");
*Src=0;
return 0;
}
if(str_cmp(Z,"$names")==0)
{
Abort("$NAMESPACE/$ENDNAMESPACE have been removed from this version. Use NAMESPACE / END NAMESPACE instead.");
break;
}
if(str_cmp(Z,"$usena")==0)
{
UseCpp=TRUE;
strcpy(szTmp,mid(Src,inchr(Src," ")+1));
if(str_cmp(right(trim(szTmp),1),";")!=0)
{
fprintf(Outfile,"%s%s%s\n","using namespace ",szTmp,";");
}
else
{
fprintf(Outfile,"%s%s\n","using namespace ",szTmp);
}
*Src=0;
return 0;
}
if(str_cmp(Z,"$class")==0)
{
Abort("$CLASS has been removed from this version. Use CLASS instead.");
return 0;
}
if(str_cmp(Z,"$inter")==0)
{
static int BeenHere;
UseCpp=TRUE;
strcpy(szTmp,remain(Src,SPC));
if(!BeenHere)
{
BeenHere++;
fprintf(FP4,"%s\n","#ifndef __cplusplus");
fprintf(FP4,"%s\n"," #error A C++ compiler is required");
fprintf(FP4,"%s\n","#endif");
}
fprintf(FP4,"%s%s%s\n","interface ",szTmp," {");
for(;;)
{
if(EoF(SourceFile))
{
Abort("$Interface Without $EndInterface");
}
Src[0]=0;
AR_fgets_retval=fgets(Src,65535,SourceFile);
if(Src[strlen(Src)-1]==10)Src[strlen(Src)-1]=0;
ModuleLineNos[ModuleNdx]++;
if(iMatchLft(ltrim(Src),"$endinterface"))
{
break;
}
fprintf(FP4,"%s\n",Src);
}
fprintf(FP4,"%s%s%s\n","}",trim(join(2,Src,13)),";");
return 0;
}
if(str_cmp(Z,"$comme")==0)
{
*Src=0;
for(;;)
{
if(EoF(SourceFile))
{
Abort("Unbalanced $Comment");
}
Src[0]=0;
AR_fgets_retval=fgets(Src,65535,SourceFile);
if(Src[strlen(Src)-1]==10)Src[strlen(Src)-1]=0;
ModuleLineNos[ModuleNdx]++;
StripTabs();
if(iMatchLft(ltrim(Src),"$comment"))
{
break;
}
fprintf(Outfile,"%s%s\n","// ",Src);
}
*Src=0;
return 0;
}
if(str_cmp(Z,"$ccode")==0)
{
*Src=0;
for(;;)
{
if(EoF(SourceFile))
{
Abort("Unbalanced $Ccode");
}
Src[0]=0;
AR_fgets_retval=fgets(Src,65535,SourceFile);
if(Src[strlen(Src)-1]==10)Src[strlen(Src)-1]=0;
ModuleLineNos[ModuleNdx]++;
StripTabs();
if(iMatchLft(ltrim(Src),"$ccode"))
{
if(SrcFlag)
{
fprintf(Outfile,"%s%s%s%s%s\n","// [",trim(Modules[ModuleNdx])," - ",trim(str(ModuleLineNos[ModuleNdx])),"] End of $CCODE Block");
}
break;
}
fprintf(Outfile,"%s\n",rtrim(Src));
}
*Src=0;
return 0;
}
if(str_cmp(Z,"$cprot")==0)
{
FastLexer(Src,SPC,"!");
if(iMatchWrd(Stk[2],"!"))
{
ProtoCnt++;
strcpy(ProtoType[ProtoCnt].Prototype,remain(Src,"!"));
*ProtoType[ProtoCnt].Condition=0;
ProtoType[ProtoCnt].CondLevel=0;
}
else
{
i=iMatchNQ(Src,"function");
if(i==0)
{
i=iMatchNQ(Src,"sub");
}
if(i)
{
strcpy(Src, join(2,"c_declare ",mid(Src,i)));
}
else
{
i=iMatchNQ(Src,"$cproto");
strcpy(Src, join(2,"c_declare function ",mid(Src,i+7)));
}
UseCProto=TRUE;
return 2;
}
*Src=0;
return 0;
}
if(str_cmp(Z,"$heade")==0)
{
*Src=0;
fprintf(FP7,"%s\n","// ***************************************************");
fprintf(FP7,"%s\n","");
for(;;)
{
if(EoF(SourceFile))
{
Abort("Unbalanced $Header");
}
Src[0]=0;
AR_fgets_retval=fgets(Src,65535,SourceFile);
if(Src[strlen(Src)-1]==10)Src[strlen(Src)-1]=0;
ModuleLineNos[ModuleNdx]++;
StripTabs();
strcpy(Src,trim(Src));
if(iMatchLft(Src,"$heade"))
{
break;
}
fprintf(FP7,"%s\n",Src);
}
*Src=0;
fprintf(FP7,"%s\n","");
return 0;
}
if(str_cmp(Z,"$asm")==0)
{
if(!iMatchLft(Src,"$asm"))
{
Abort(join(2,"Unknown metastatement: ",Src));
}
*Src=0;
for(;;)
{
if(EoF(SourceFile))
{
Abort("Unbalanced $Asm");
}
Src[0]=0;
AR_fgets_retval=fgets(Src,65535,SourceFile);
if(Src[strlen(Src)-1]==10)Src[strlen(Src)-1]=0;
ModuleLineNos[ModuleNdx]++;
if(SrcFlag)
{
fprintf(Outfile,"%s%s\n","// ",Src);
}
StripTabs();
strcpy(Src,trim(Src));
static int meta_asm_loop;
memset(&meta_asm_loop,0,sizeof(meta_asm_loop));
static bool meta_asm_comment_present;
memset(&meta_asm_comment_present,0,sizeof(meta_asm_comment_present));
static int Src_Len;
memset(&Src_Len,0,sizeof(Src_Len));
Src_Len=strlen(Src);
meta_asm_comment_present=FALSE;
for(meta_asm_loop=0; meta_asm_loop<=Src_Len; meta_asm_loop+=1)
{
if(Src[meta_asm_loop]==39||Src[meta_asm_loop]==59)
{
strcpy(lszTmp,right(Src,Src_Len-meta_asm_loop-1));
Src[meta_asm_loop]=0;
meta_asm_comment_present=TRUE;
break;
}
}
strcpy(Src,trim(Src));
if(iMatchLft(Src,"$asm"))
{
break;
}
strcpy(Src,replace(Src,"$","0x"));
strcpy(Src,iReplace(Src,"&h","0x"));
if(Src[0]!=0)
{
strcpy(Src, join(3,"_asm(",enc(Src),chr(1)));
if(meta_asm_comment_present)
{
strcpy(Src, join(4,Src,TAB,"//",lszTmp));
}
strcpy(SrcTmp,Src);
fprintf(Outfile,"%s\n","#if !defined( __POCC__ ) && !defined (__cplusplus )");
strcpy(Src,replace(Src,chr(1),")"));
fprintf(Outfile,"%s\n",Src);
fprintf(Outfile,"%s\n","#else");
strcpy(SrcTmp,replace(SrcTmp,"_asm(","__asm{"));
strcpy(SrcTmp,replace(SrcTmp,chr(1),"}"));
fprintf(Outfile,"%s\n",RemoveStr(SrcTmp,DQ));
fprintf(Outfile,"%s\n","#endif");
}
}
*Src=0;
return 0;
}
if(str_cmp(Z,"#inclu")==0)
{
strcpy(Src,RemoveStr(lcase(Src),"#include"));
strcpy(Src,trim(Src));
fprintf(FP7,"%s%s\n","#include ",Src);
*Src=0;
return 0;
}
if(str_cmp(Z,"$libra")==0)
{
strcpy(Src,replace(Src,"\\","\\\\"));
strcpy(Src,RemoveStr(lcase(Src),"$library"));
strcpy(Src,trim(Src));
AddLibrary(Src);
*Src=0;
return 0;
}
if(str_cmp(Z,"$nolib")==0)
{
strcpy(Src,replace(Src,"\\","\\\\"));
strcpy(Src,RemoveStr(lcase(Src),"$nolibrary"));
RemoveLibrary(Src);
*Src=0;
return 0;
}
break;
}
}
return 2;
}
int SubVarType (int TokenNum)
{
int k;
int j=0;
k=CheckLocal(Stk[TokenNum], &j);
if(k==vt_CHAR)
{
if(*LocalVars[j].VarDim!=91&&LocalVars[j].VarPntr==0)
{
k=vt_INTEGER;
}
}
else if(k==vt_UNKNOWN)
{
k=CheckGlobal(Stk[TokenNum], &j);
if(k==vt_CHAR)
{
if(*GlobalVars[j].VarDim!=91&&GlobalVars[j].VarPntr==0)
{
k=vt_INTEGER;
}
}
}
j=(UCHAR)*(right(Stk[TokenNum],1));
for(;;)
{
if(k==vt_STRVAR||k==vt_CHAR)
{
if(j!=36)
{
strcat(Stk[TokenNum],"$");
}
break;
}
if(k==vt_INTEGER)
{
if(j!=37)
{
strcat(Stk[TokenNum],"%");
}
break;
}
if(k==vt_SINGLE)
{
if(j!=33)
{
strcat(Stk[TokenNum],"!");
}
break;
}
if(k==vt_DOUBLE)
{
if(j!=35)
{
strcat(Stk[TokenNum],"#");
}
break;
}
if(k==vt_LDOUBLE)
{
if(j!=166)
{
strcat(Stk[TokenNum],"¦");
}
}
break;
}
return k;
}
char * PrintWriteFormat (int DoWrite)
{
char *BCX_RetStr={0};
ARGTYPE Stak[128];
char Frmat[2048];
char Arg[2048];
char *ZZ;
ZZ=(char*)calloc(256+65535,1);
char Cast[2048];
int NewLineFlag=0;
int Argcount=0;
int i=0;
int j=0;
int k=0;
*Frmat=0;
*Arg=0;
*ZZ=0;
if(str_cmp(Stk[Ndx],";")==0)
{
NewLineFlag=TRUE;
Ndx--;
}
if(Ndx==1)
{
goto PRINTWRITELABEL;
}
Stak[1].ArgType=-1;
j=2;
while(j<=Ndx)
{
if(str_cmp(Clean(Stk[j]),"BCX_DynaCall")!=0)
{
i=SubVarType(j);
if(Stak[Argcount+1].ArgType==-1)
{
if(i==vt_CHAR||i==vt_STRVAR||i==vt_INTEGER||i==vt_SINGLE||i==vt_DOUBLE||i==vt_LDOUBLE)
{
Stak[Argcount+1].ArgType=i;
}
}
if(str_cmp(Stk[j],"(")==0)
{
i=0;
for(;;)
{
if(str_cmp(Stk[j],"(")==0)
{
i++;
}
if(str_cmp(Stk[j],")")==0)
{
i--;
}
strcat(Arg,Stk[j]);
j++;
if(i<=0||j>=Ndx)
{
break;
}
}
}
if(str_cmp(Stk[j],"[")==0)
{
i=0;
for(;;)
{
if(str_cmp(Stk[j],"[")==0)
{
i++;
}
if(str_cmp(Stk[j],"]")==0)
{
i--;
}
strcat(Arg,Stk[j]);
j++;
if(str_cmp(Stk[j],"[")==0 && i==0)
{
continue;
}
if(i<=0||j>=Ndx)
{
break;
}
}
}
if(str_cmp(Stk[j],";")==0 || str_cmp(Stk[j],",")==0 || str_cmp(Stk[j],"&")==0)
{
Argcount++;
strcpy(Stak[Argcount].Arg,Arg);
Stak[Argcount+1].ArgType=-1;
*Arg=0;
j++;
}
else
{
strcat(Arg,Stk[j]);
j++;
}
}
else
{
strcat(Arg,Stk[j]);
j++;
}
}
Argcount++;
strcpy(Stak[Argcount].Arg,Arg);
*Arg=0;
for(i=1; i<=Argcount; i+=1)
{
j=Stak[i].ArgType;
if(j==-1)
{
strcpy(ZZ,extract(Stak[i].Arg,"("));
j=DataType(ZZ);
}
for(;;)
{
if(j==vt_STRLIT||j==vt_STRVAR||j==vt_CHAR)
{
if(DoWrite)
{
strcpy(Frmat, join(7,Frmat,"\\",DQ,"%s","\\",DQ,","));
}
else
{
strcat(Frmat,"%s");
}
if(str_cmp(left(ZZ,12),"BCX_DynaCall")==0)
{
strcpy(Arg, join(3,Arg,",(char*)",Stak[i].Arg));
}
else
{
strcpy(Arg, join(3,Arg,",",Stak[i].Arg));
}
break;
}
if(j==vt_INTEGER||j==vt_DECFUNC)
{
if(DoWrite)
{
strcpy(Frmat, join(3,Frmat,"%d",","));
}
else
{
strcat(Frmat,"%d");
}
strcpy(Arg, join(3,Arg,",(int)",Stak[i].Arg));
break;
}
if(j==vt_SINGLE)
{
if(DoWrite)
{
strcpy(Frmat, join(3,Frmat,"%.7G",","));
}
else
{
strcat(Frmat,"%.7G");
}
strcpy(Arg, join(3,Arg,",(float)",Stak[i].Arg));
break;
}
if(j==vt_DOUBLE||j==vt_NUMBER)
{
if(DoWrite)
{
strcpy(Frmat, join(3,Frmat,"%.15G",","));
}
else
{
strcat(Frmat,"%.15G");
}
strcpy(Arg, join(3,Arg,",(double)",Stak[i].Arg));
break;
}
if(j==vt_LDOUBLE)
{
if(DoWrite)
{
strcpy(Frmat, join(3,Frmat,"%.19LG",","));
}
else
{
strcat(Frmat,"%.19LG");
}
strcpy(Arg, join(3,Arg,",(LDOUBLE)",Stak[i].Arg));
break;
}
// case else
{
if((UCHAR)*(Stak[i].Arg)==40)
{
*ZZ=0;
strcat(Arg,",");
for(;;)
{
k=instr_b(Stak[i].Arg,")");
strcpy(Cast,mid(Stak[i].Arg,1,k));
strcpy(Stak[i].Arg,trim(mid(Stak[i].Arg,k+1)));
strcpy(Cast,iReplace(Cast,"char*","char *"));
strcpy(Cast,iReplace(Cast,"integer","int"));
strcpy(Cast,iReplace(Cast,"single","float"));
strcpy(Cast,iReplace(Cast,"ldouble","LDOUBLE"));
if(ZZ[0]==0)
{
if(str_cmp(Cast,"(char *)")==0 || str_cmp(Cast,"(int)")==0 || str_cmp(Cast,"(float)")==0 || str_cmp(Cast,"(double)")==0 || str_cmp(Cast,"(LDOUBLE)")==0)
{
strcpy(ZZ,Cast);
}
else
{
strcpy(ZZ,"(double)");
strcpy(Cast, join(2,ZZ,Cast));
}
RemoveAll(ZZ,"()");
strcpy(ZZ,iReplace(ZZ,"char *","%s"));
strcpy(ZZ,iReplace(ZZ,"int","%d"));
strcpy(ZZ,iReplace(ZZ,"float","%.7G"));
strcpy(ZZ,iReplace(ZZ,"ldouble","%.19LG"));
strcpy(ZZ,iReplace(ZZ,"double","%.15G"));
}
strcat(Arg,Cast);
if(!((UCHAR)*(Stak[i].Arg)==40))
{
break;
}
}
strcat(Arg,Stak[i].Arg);
strcat(Frmat,ZZ);
if(DoWrite)
{
strcat(Frmat,",");
}
}
else
{
if(DoWrite)
{
strcpy(Frmat, join(3,Frmat,"%G",","));
}
else
{
strcat(Frmat,"%G");
strcpy(Arg, join(3,Arg,",(float)",Stak[i].Arg));
}
}
}
break;
}
}
if(DoWrite)
{
strcpy(Frmat,left(Frmat,strlen(Frmat)-1));
}
PRINTWRITELABEL:;
if(NewLineFlag==0)
{
strcat(Frmat,"\\n");
}
BCX_RetStr=join(4,"printf(",enc(Frmat),Clean(Arg),");");
if(ZZ)free(ZZ);
return BCX_RetStr;
}
void EmitInputCode (void)
{
int Argcount=0;
int VarCnt=0;
int i=0;
int j=0;
int l=0;
char Arg[2048];
char Tmp[2048];
char Frmat[2048];
static char Stak[128][2048];
memset(&Stak,0,sizeof(Stak));
char Y[2048];
char *ZZ;
ZZ=(char*)calloc(256+65535,1);
Use_Inputbuffer=TRUE;
Use_Scan=TRUE;
Use_Split=TRUE;
Use_Remove=TRUE;
Use_StrStr=TRUE;
Use_Mid=TRUE;
Use_Left=TRUE;
Use_Instr=TRUE;
Use_Stristr=TRUE;
UseLCaseTbl=TRUE;
UseFlag=TRUE;
Use_Lineinput=TRUE;
*Arg=0;
*ZZ=0;
*Frmat=0;
strcpy(Tmp, join(7,DQ,",",DQ,",",DQ," ",DQ));
if(DataType(Stk[2])==vt_STRLIT)
{
fprintf(Outfile,"%s%s%s%s\n",Scoot,"printf(",Clean(Stk[2]),");");
}
if(DataType(Stk[2])==vt_STRLIT)
{
j=4;
}
else
{
j=2;
}
l=j;
while(j<=Ndx)
{
if(j==l)
{
i=SubVarType(j);
}
if(str_cmp(Stk[j],",")==0)
{
l=j+1;
}
strcat(ZZ,Stk[j]);
j++;
}
FastLexer(ZZ,"",",");
j=1;
while(j<=Ndx)
{
if(str_cmp(Stk[j],",")==0)
{
Argcount++;
strcpy(Stak[Argcount],Arg);
*Arg=0;
j++;
}
else
{
strcat(Arg,Stk[j]);
j++;
if(j<Ndx)
{
if(str_cmp(Stk[j],"[")==0)
{
i=0;
for(;;)
{
DOAGAIN:;
if(str_cmp(Stk[j],"[")==0)
{
i++;
}
if(str_cmp(Stk[j],"]")==0)
{
i--;
}
strcat(Arg,Stk[j]);
j++;
if(str_cmp(Stk[j],"[")==0 && i==0)
{
goto DOAGAIN;
}
if(i<=0||j>=Ndx)
{
break;
}
}
}
}
}
}
Argcount++;
strcpy(Stak[Argcount],Arg);
*Arg=0;
for(i=1; i<=Argcount; i+=1)
{
strcpy(Y,Stak[i]);
j=DataType(Y);
for(;;)
{
if(j==vt_STRVAR)
{
strcat(Frmat,"%s");
strcpy(Arg, join(3,Arg,",",Clean(Stak[i])));
fprintf(Outfile,"%s%s%s%s\n",Scoot,"*",trim(Clean(Stak[i])),"=0;");
VarCnt++;
break;
}
if(j==vt_INTEGER)
{
strcat(Frmat,"%d");
strcpy(Arg, join(3,Arg,",&",Clean(Stak[i])));
fprintf(Outfile,"%s%s%s\n",Scoot,Clean(Stak[i]),"=0;");
VarCnt++;
break;
}
if(j==vt_SINGLE)
{
strcat(Frmat,"%g");
strcpy(Arg, join(3,Arg,",&",Clean(Stak[i])));
fprintf(Outfile,"%s%s%s\n",Scoot,Clean(Stak[i]),"=0;");
VarCnt++;
break;
}
if(j==vt_DOUBLE)
{
strcat(Frmat,"%lG");
strcpy(Arg, join(3,Arg,",&",Clean(Stak[i])));
fprintf(Outfile,"%s%s%s\n",Scoot,Clean(Stak[i]),"=0;");
VarCnt++;
break;
}
if(j==vt_LDOUBLE)
{
strcat(Frmat,"%lG");
strcpy(Arg, join(3,Arg,",&",Clean(Stak[i])));
fprintf(Outfile,"%s%s%s\n",Scoot,Clean(Stak[i]),"=0;");
VarCnt++;
break;
}
// case else
{
strcat(Frmat,"%d");
strcpy(Arg, join(3,Arg,",&",Clean(Stak[i])));
fprintf(Outfile,"%s%s%s\n",Scoot,Clean(Stak[i]),"=0;");
VarCnt++;
}
break;
}
}
fprintf(Outfile,"%s%s\n",Scoot,"AR_fgets_retval=fgets(InputBuffer,sizeof(InputBuffer),stdin);");
fprintf(Outfile,"%s%s\n",Scoot,"InputBuffer[strlen(InputBuffer)-1]=0;");
fprintf(Outfile,"%s%s%s%s%s\n",Scoot,"ScanError = scan(InputBuffer,",enc(Frmat),Arg,");\n");
fprintf(Outfile,"%s%s\n",Scoot,"*InputBuffer=0;");
if(ZZ)free(ZZ);
}
void EmitFileInputCode (void)
{
int Argcount=0;
int VarCnt=0;
int i;
int j;
char Arg[2048];
char Frmat[2048];
char FHandle[2048];
char Y[2048];
char *ZZ;
ZZ=(char*)calloc(256+65535,1);
static char Stak[128][2048];
memset(&Stak,0,sizeof(Stak));
*Arg=0;
*Frmat=0;
*ZZ=0;
*FHandle=0;
Use_Inputbuffer=TRUE;
Use_Scan=TRUE;
Use_Split=TRUE;
Use_Remove=TRUE;
Use_StrStr=TRUE;
Use_Mid=TRUE;
Use_Left=TRUE;
Use_Instr=TRUE;
Use_Stristr=TRUE;
UseLCaseTbl=TRUE;
i=4;
for(j=2; j<=Ndx; j+=1)
{
if(*Stk[j]==44)
{
i=j+1;
break;
}
strcat(FHandle,Stk[j]);
}
for(j=i; j<=Ndx; j+=1)
{
if(j==i)
{
SubVarType(j);
}
if(str_cmp(Stk[j],",")==0)
{
SubVarType(j+1);
}
strcat(ZZ,Stk[j]);
}
FastLexer(ZZ,"",",");
j=1;
while(j<=Ndx)
{
if(str_cmp(Stk[j],",")==0)
{
Argcount++;
strcpy(Stak[Argcount],Arg);
*Arg=0;
j++;
}
else
{
strcat(Arg,Stk[j]);
j++;
if(j<Ndx)
{
if(str_cmp(Stk[j],"[")==0)
{
i=0;
for(;;)
{
DOAGAIN:;
if(str_cmp(Stk[j],"[")==0)
{
i++;
}
if(str_cmp(Stk[j],"]")==0)
{
i--;
}
strcat(Arg,Stk[j]);
j++;
if(str_cmp(Stk[j],"[")==0 && i==0)
{
goto DOAGAIN;
}
if(i<=0||j>=Ndx)
{
break;
}
}
}
}
}
}
Argcount++;
strcpy(Stak[Argcount],Arg);
*Arg=0;
for(i=1; i<=Argcount; i+=1)
{
strcpy(Y,Stak[i]);
j=DataType(Y);
for(;;)
{
if(j==vt_STRVAR)
{
strcat(Frmat,"%s");
strcpy(Arg, join(3,Arg,",",Clean(Stak[i])));
fprintf(Outfile,"%s%s%s%s\n",Scoot,"*",trim(Clean(Stak[i])),"=0;");
VarCnt++;
break;
}
if(j==vt_INTEGER)
{
strcat(Frmat,"%d");
strcpy(Arg, join(3,Arg,",&",Clean(Stak[i])));
fprintf(Outfile,"%s%s%s\n",Scoot,Clean(Stak[i]),"=0;");
VarCnt++;
break;
}
if(j==vt_SINGLE)
{
strcat(Frmat,"%g");
strcpy(Arg, join(3,Arg,",&",Clean(Stak[i])));
fprintf(Outfile,"%s%s%s\n",Scoot,Clean(Stak[i]),"=0;");
VarCnt++;
break;
}
if(j==vt_DOUBLE)
{
strcat(Frmat,"%lG");
strcpy(Arg, join(3,Arg,",&",Clean(Stak[i])));
fprintf(Outfile,"%s%s%s\n",Scoot,Clean(Stak[i]),"=0;");
VarCnt++;
break;
}
if(j==vt_LDOUBLE)
{
strcat(Frmat,"%lG");
strcpy(Arg, join(3,Arg,",&",Clean(Stak[i])));
fprintf(Outfile,"%s%s%s\n",Scoot,Clean(Stak[i]),"=0;");
VarCnt++;
break;
}
// case else
{
strcat(Frmat,"%d");
strcpy(Arg, join(3,Arg,",&",Clean(Stak[i])));
fprintf(Outfile,"%s%s%s\n",Scoot,Clean(Stak[i]),"=0;");
VarCnt++;
}
break;
}
}
fprintf(Outfile,"%s%s%s%s\n",Scoot,"AR_fgets_retval=fgets(InputBuffer,65535,",FHandle,");");
fprintf(Outfile,"%s%s\n",Scoot,"if(InputBuffer[strlen(InputBuffer)-1]== 10)");
fprintf(Outfile,"%s%s\n",Scoot," InputBuffer[strlen(InputBuffer)-1]=0;");
fprintf(Outfile,"%s%s%s%s%s\n",Scoot,"ScanError = scan(InputBuffer,",enc(Frmat),Arg,");\n");
fprintf(Outfile,"%s%s\n",Scoot,"*InputBuffer=0;");
if(ZZ)free(ZZ);
}
void AddFuncs (void)
{
char *ZZ;
ZZ=(char*)calloc(256+65535,1);
char Last[2048];
*Last=0;
CloseAll();
if((FP1=fopen(prcFile,"r"))==0)
{
fprintf(stderr,"Can't open file %s\n",prcFile);
exit(1);
}
if((Outfile=fopen(FileOut,"a"))==0)
{
fprintf(stderr,"Can't open file %s\n",FileOut);
exit(1);
}
if(ProtoType[1].Prototype[0]>0)
{
fprintf(Outfile,"%s\n","");
fprintf(Outfile,"%s\n","// ************************************");
fprintf(Outfile,"%s%s\n","// ",BCX_STR_USR_PROCS);
fprintf(Outfile,"%s\n","// ************************************");
fprintf(Outfile,"%s\n","\n");
}
while(!EoF(FP1))
{
ZZ[0]=0;
AR_fgets_retval=fgets(ZZ,65535,FP1);
if(ZZ[strlen(ZZ)-1]==10)ZZ[strlen(ZZ)-1]=0;
if(instr_b(ZZ,"DefWindowProc"))
{
if(instr_b(Last,"return ")||instr_b(Last,"CallWindowProc")||instr_b(Last,"DefWindowProc")||instr_b(Last,"DefMDIChildProc")||instr_b(Last,"DefFrameProc"))
{
*Last=0;
continue;
}
}
fprintf(Outfile,"%s\n",ZZ);
if(str_cmp(left(ZZ,2),"//")!=0)
{
strcpy(Last,ZZ);
}
}
CloseAll();
remove (prcFile);
remove (udtFile);
remove (datFile);
remove (cstFile);
remove (ovrFile);
remove (setFile);
remove (enuFile);
if(ZZ)free(ZZ);
}
int CheckLocal (char *ZZ, int* varidx)
{
char TT[2048];
if(LocalVarCnt)
{
strcpy(TT,Clean(ZZ));
RemoveAll(TT," &*()",1);
if(instr_b(TT,"["))
{
strcpy(TT,left(TT,instr_b(TT,"[")-1));
}
{int i;
for(i=1; i<=LocalVarCnt; i+=1)
{
if(str_cmp(TT,LocalVars[i].VarName)==0)
{
(*varidx)=i;
return LocalVars[i].VarType;
}
}
}
}
return vt_UNKNOWN;
}
int CheckGlobal (char *ZZ, int* varidx)
{
int hn;
int s;
char TT[2048];
strcpy(TT,Clean(ZZ));
RemoveAll(TT," &*()",1);
if(instr_b(TT,"["))
{
strcpy(TT,left(TT,instr_b(TT,"[")-1));
}
hn=HashNumber(TT);
while(GlobalVarHash[hn])
{
s=GlobalVarHash[hn];
if(str_cmp(TT,GlobalVars[s].VarName)==0)
{
(*varidx)=s;
return GlobalVars[s].VarType;
}
hn=imod(hn+1,MaxGlobalVars);
}
return vt_UNKNOWN;
}
int CheckType (char *ZZ)
{
char Keyword[2048];
int varid=0;
int i;
strcpy(Keyword,lcase(ZZ));
for(;;)
{
if(str_cmp(Keyword,"int")==0)
{
return vt_INTEGER;
}
if(str_cmp(Keyword,"string")==0)
{
return vt_STRVAR;
}
if(str_cmp(Keyword,"char")==0)
{
return vt_CHAR;
}
if(str_cmp(Keyword,"pchar")==0)
{
return vt_PCHAR;
}
if(str_cmp(Keyword,"byte")==0)
{
return vt_BYTE;
}
if(str_cmp(Keyword,"double")==0)
{
return vt_DOUBLE;
}
if(str_cmp(Keyword,"ldouble")==0)
{
return vt_LDOUBLE;
}
if(str_cmp(Keyword,"file")==0)
{
return vt_FILEPTR;
}
if(str_cmp(Keyword,"float")==0)
{
return vt_SINGLE;
}
if(str_cmp(Keyword,"bool")==0 || str_cmp(Keyword,"boolean")==0)
{
return vt_BOOL;
}
if(str_cmp(Keyword,"long")==0)
{
return vt_LONG;
}
if(str_cmp(Keyword,"dword")==0)
{
return vt_DWORD;
}
if(str_cmp(Keyword,"farproc")==0)
{
return vt_FARPROC;
}
if(str_cmp(Keyword,"void")==0)
{
return vt_VOID;
}
if(str_cmp(Keyword,"lpbyte")==0)
{
return vt_LPBYTE;
}
if(str_cmp(Keyword,"lresult")==0)
{
return vt_LRESULT;
}
if(str_cmp(Keyword,"short")==0)
{
return vt_SHORT;
}
if(str_cmp(Keyword,"ushort")==0)
{
return vt_USHORT;
}
if(str_cmp(Keyword,"uint")==0)
{
return vt_UINT;
}
if(str_cmp(Keyword,"ulong")==0)
{
return vt_ULONG;
}
if(str_cmp(Keyword,"colorref")==0)
{
return vt_COLORREF;
}
if(str_cmp(Keyword,"handle")==0)
{
return vt_HANDLE;
}
if(str_cmp(Keyword,"hdc")==0)
{
return vt_HDC;
}
if(str_cmp(Keyword,"variant")==0)
{
return vt_VARIANT;
}
break;
}
i=CheckLocal(ZZ, &varid);
if(i==vt_UNKNOWN)
{
i=DefsID(ZZ);
if(i)
{
return TypeDefs[i].TypeofDef;
}
}
else
{
return i;
}
return CheckGlobal(ZZ, &varid);
}
void ExportInternalConst (void)
{
if(Use_FillArray)
{
strcpy(Src,"CONST vt_INTEGER = 2");
PassOne=1;
Parse(Src);
Emit();
strcpy(Src,"CONST vt_SINGLE = 3");
PassOne=1;
Parse(Src);
Emit();
strcpy(Src,"CONST vt_DOUBLE = 4");
PassOne=1;
Parse(Src);
Emit();
strcpy(Src,"CONST vt_LDOUBLE = 5");
PassOne=1;
Parse(Src);
Emit();
}
}
int RestrictedWords (char *ZZ)
{
if(str_cmp(ZZ,"CmdLine")==0)
{
return 1;
}
if(str_cmp(ZZ,"CmdShow")==0)
{
return 1;
}
if(str_cmp(ZZ,"hInst")==0)
{
return 1;
}
if(str_cmp(ZZ,"hPrev")==0)
{
return 1;
}
if(str_cmp(ZZ,"hWnd")==0)
{
return 1;
}
if(str_cmp(ZZ,"lParam")==0)
{
return 1;
}
if(str_cmp(ZZ,"Msg")==0)
{
return 1;
}
if(str_cmp(ZZ,"wParam")==0)
{
return 1;
}
if(str_cmp(ZZ,"vt_INTEGER")==0)
{
return 1;
}
if(str_cmp(ZZ,"vt_SINGLE")==0)
{
return 1;
}
if(str_cmp(ZZ,"vt_DOUBLE")==0)
{
return 1;
}
if(str_cmp(ZZ,"vt_LDOUBLE")==0)
{
return 1;
}
return 0;
}
int DataType (char *ZZ)
{
char Keyword[2048];
int i;
if(ZZ[0]==34)
{
return vt_STRLIT;
}
if(inchr(ZZ,"$"))
{
return vt_STRVAR;
}
if(IsNumber(ZZ))
{
return vt_NUMBER;
}
i=DefsID(ZZ);
if(i)
{
return TypeDefs[i].TypeofDef;
}
strcpy(Keyword,lcase(ZZ));
if(str_cmp(Keyword,"strlen")==0)
{
return vt_DECFUNC;
}
if(str_cmp(Keyword,"instr")==0)
{
return vt_DECFUNC;
}
if(str_cmp(Keyword,"inchr")==0)
{
return vt_DECFUNC;
}
if(str_cmp(Keyword,"sizeof")==0)
{
return vt_DECFUNC;
}
if(str_cmp(Keyword,"tally")==0)
{
return vt_DECFUNC;
}
if(str_cmp(Keyword,"band")==0)
{
return vt_DECFUNC;
}
if(str_cmp(Keyword,"bor")==0)
{
return vt_DECFUNC;
}
if(str_cmp(Keyword,"lof")==0)
{
return vt_DOUBLE;
}
if(str_cmp(Keyword,"pos")==0)
{
return vt_DECFUNC;
}
if(str_cmp(Keyword,"qbcolor")==0)
{
return vt_DECFUNC;
}
if(str_cmp(Keyword,"split")==0)
{
return vt_DECFUNC;
}
if(str_cmp(Keyword,"dsplit")==0)
{
return vt_DECFUNC;
}
if(str_cmp(Keyword,"sgn")==0)
{
return vt_DECFUNC;
}
if(str_cmp(Keyword,"timer")==0)
{
return vt_SINGLE;
}
if(str_cmp(Keyword,"keypress()")==0)
{
return vt_DECFUNC;
}
if(str_cmp(Keyword,"getattr")==0)
{
return vt_DECFUNC;
}
if(str_cmp(Keyword,"fix")==0)
{
return vt_DECFUNC;
}
if(str_cmp(Keyword,"instrrev")==0)
{
return vt_DECFUNC;
}
if(str_cmp(Keyword,"kbhit")==0)
{
return vt_DECFUNC;
}
if(str_cmp(Keyword,"exp")==0)
{
return vt_DOUBLE;
}
if(str_cmp(Keyword,"expl")==0)
{
return vt_LDOUBLE;
}
if(str_cmp(Keyword,"sinh")==0)
{
return vt_DOUBLE;
}
if(str_cmp(Keyword,"cosh")==0)
{
return vt_DOUBLE;
}
if(str_cmp(Keyword,"tanh")==0)
{
return vt_DOUBLE;
}
if(str_cmp(Keyword,"asinh")==0)
{
return vt_DOUBLE;
}
if(str_cmp(Keyword,"acosh")==0)
{
return vt_DOUBLE;
}
if(str_cmp(Keyword,"atanh")==0)
{
return vt_DOUBLE;
}
if(str_cmp(Keyword,"round")==0)
{
return vt_DOUBLE;
}
if(str_cmp(Keyword,"val")==0)
{
return vt_DOUBLE;
}
if(str_cmp(Keyword,"vall")==0)
{
return vt_LDOUBLE;
}
if(str_cmp(Keyword,"iif")==0)
{
return vt_DOUBLE;
}
if(str_cmp(Keyword,"bin2dec")==0)
{
return vt_INTEGER;
}
if(str_cmp(Keyword,"hex2dec")==0)
{
return vt_INTEGER;
}
if(str_cmp(Keyword,"rnd")==0)
{
return vt_SINGLE;
}
if(str_cmp(Keyword,"frac")==0)
{
return vt_DOUBLE;
}
if(str_cmp(Keyword,"fracl")==0)
{
return vt_LDOUBLE;
}
if(str_cmp(Keyword,"asin")==0)
{
return vt_DOUBLE;
}
if(str_cmp(Keyword,"asinl")==0)
{
return vt_LDOUBLE;
}
if(str_cmp(Keyword,"hypot")==0)
{
return vt_DOUBLE;
}
if(str_cmp(Keyword,"hypotl")==0)
{
return vt_LDOUBLE;
}
if(str_cmp(Keyword,"log")==0)
{
return vt_DOUBLE;
}
if(str_cmp(Keyword,"logl")==0)
{
return vt_LDOUBLE;
}
if(str_cmp(Keyword,"log10")==0)
{
return vt_DOUBLE;
}
if(str_cmp(Keyword,"log10l")==0)
{
return vt_LDOUBLE;
}
if(str_cmp(Keyword,"acos")==0)
{
return vt_DOUBLE;
}
if(str_cmp(Keyword,"acosl")==0)
{
return vt_LDOUBLE;
}
if(str_cmp(Keyword,"atan")==0)
{
return vt_DOUBLE;
}
if(str_cmp(Keyword,"atanl")==0)
{
return vt_DOUBLE;
}
if(str_cmp(Keyword,"sin")==0)
{
return vt_DOUBLE;
}
if(str_cmp(Keyword,"sinl")==0)
{
return vt_LDOUBLE;
}
if(str_cmp(Keyword,"cos")==0)
{
return vt_DOUBLE;
}
if(str_cmp(Keyword,"cosl")==0)
{
return vt_LDOUBLE;
}
if(str_cmp(Keyword,"tan")==0)
{
return vt_DOUBLE;
}
if(str_cmp(Keyword,"tanl")==0)
{
return vt_LDOUBLE;
}
if(str_cmp(Keyword,"pow")==0)
{
return vt_DOUBLE;
}
if(str_cmp(Keyword,"powl")==0)
{
return vt_LDOUBLE;
}
if(str_cmp(Keyword,"sqrt")==0)
{
return vt_DOUBLE;
}
if(str_cmp(Keyword,"sqrtl")==0)
{
return vt_LDOUBLE;
}
if(str_cmp(Keyword,"min")==0)
{
return vt_DOUBLE;
}
if(str_cmp(Keyword,"max")==0)
{
return vt_DOUBLE;
}
if(str_cmp(Keyword,"exist")==0)
{
return vt_DECFUNC;
}
if(str_cmp(Keyword,"abs")==0)
{
return vt_DOUBLE;
}
if(str_cmp(Keyword,"absl")==0)
{
return vt_LDOUBLE;
}
if(str_cmp(Keyword,"freefile")==0)
{
return vt_FILEPTR;
}
if(str_cmp(Keyword,"fint")==0)
{
return vt_INTEGER;
}
if(inchr(ZZ,"%"))
{
return vt_INTEGER;
}
if(inchr(ZZ,"!"))
{
return vt_SINGLE;
}
if(inchr(ZZ,"#"))
{
return vt_DOUBLE;
}
if(inchr(ZZ,"^"))
{
return vt_DOUBLE;
}
if(inchr(ZZ,"¦"))
{
return vt_LDOUBLE;
}
if(iMatchRgt(ZZ,"@"))
{
return vt_FILEPTR;
}
if(inchr(ZZ," "))
{
return vt_UDT;
}
if(isalpha(*ZZ))
{
return vt_INTEGER;
}
return vt_UNKNOWN;
}
void CloseAll (void)
{
#if defined (__APPLE__)
if(SourceFile)
{
fclose(SourceFile);
SourceFile=NULL;
}
if(FP2)
{
fclose(FP2);
FP2=NULL;
}
if(FP3)
{
fclose(FP3);
FP3=NULL;
}
if(FP4)
{
fclose(FP4);
FP4=NULL;
}
if(FP5)
{
fclose(FP5);
FP5=NULL;
}
if(FP6)
{
fclose(FP6);
FP6=NULL;
}
if(FP7)
{
fclose(FP7);
FP7=NULL;
}
if(FP8)
{
fclose(FP8);
FP8=NULL;
}
if(FP9)
{
fclose(FP9);
FP9=NULL;
}
if(FP10)
{
fclose(FP10);
FP10=NULL;
}
if(FP11)
{
fclose(FP11);
FP11=NULL;
}
if(Outfile)
{
fclose(Outfile);
Outfile=NULL;
}
if(FP1)
{
fclose(FP1);
FP1=NULL;
}
if(ResIn)
{
fclose(ResIn);
ResIn=NULL;
}
if(ResOut)
{
fclose(ResOut);
ResOut=NULL;
}
if(UserResIn)
{
fclose(UserResIn);
UserResIn=NULL;
}
if(fpErr)
{
fclose(fpErr);
fpErr=NULL;
}
if(fpHFile)
{
fclose(fpHFile);
fpHFile=NULL;
}
if(FP68)
{
fclose(FP68);
FP68=NULL;
}
if(fpdef)
{
fclose(fpdef);
fpdef=NULL;
}
if(SaveOutfileNum)
{
fclose(SaveOutfileNum);
SaveOutfileNum=NULL;
}
#else
fcloseall();
#endif
}
char * Clean (char *ZZ)
{
char *BCX_RetStr={0};
char Tmp[2048];
if(inchr(ZZ,"%"))
{
if(str_cmp(trim(ZZ),"%")==0)
{
BCX_RetStr=BCX_TmpStr(strlen(" % "));
strcpy(BCX_RetStr," % ");
return BCX_RetStr;
}
}
if(iMatchNQ(ZZ,"!="))
{
BCX_RetStr=BCX_TmpStr(strlen(ZZ));
strcpy(BCX_RetStr,ZZ);
return BCX_RetStr;
}
strcpy(Tmp,ZZ);
RemoveAll(Tmp,"%$#!@¦",1);
BCX_RetStr=BCX_TmpStr(strlen(Tmp));
strcpy(BCX_RetStr,Tmp);
return BCX_RetStr;
}
void RemoveAll (char * Arg,char * MatchChars,int qtflag)
{
PCHAR C=Arg;
PCHAR pmc;
while(*Arg)
{
if(qtflag)
{
if(*Arg==34)
{
*(C++)=*Arg;
while(*(++Arg)!=34)
{
*(C++)=*Arg;
if(*Arg==0)
{
return;
}
}
*(C++)=*(Arg++);
continue;
}
}
pmc=MatchChars;
while(*pmc)
{
if(*(pmc++)==*Arg)
{
goto SKIP;
}
}
*(C++)=*Arg;
SKIP:;
Arg++;
}
*C=0;
}
void Warning (char * ZZ,int WarnLvl)
{
static FILE *fErr;
memset(&fErr,0,sizeof(fErr));
if(WarnLvl)
{
strcpy(WarnMsg, join(7,WarnMsg," Line",str(ModuleLineNos[ModuleNdx])," in Module: ",trim(Modules[ModuleNdx])," - ",ZZ));
}
else
{
strcat(WarnMsg,ZZ);
}
strcat(WarnMsg,CRLF);
if(ErrFile)
{
if((fErr=fopen(FileErr,"a"))==0)
{
fprintf(stderr,"Can't open file %s\n",FileErr);
exit(1);
}
fprintf(fErr,"%s%s\n","WARNING ",ZZ);
if(fErr)
{
fclose(fErr);
fErr=NULL;
}
}
}
PCHAR GetVarTypeName (int i)
{
static char A[2048];
for(;;)
{
if(i==vt_INTEGER)
{
strcpy(A,"int");
break;
}
if(i==vt_STRVAR)
{
strcpy(A,"char *");
break;
}
if(i==vt_STRLIT)
{
strcpy(A,"STRLIT");
break;
}
if(i==vt_UNKNOWN)
{
strcpy(A,"UNKNOWN");
break;
}
if(i==vt_SINGLE)
{
strcpy(A,"float");
break;
}
if(i==vt_DOUBLE)
{
strcpy(A,"double");
break;
}
if(i==vt_LDOUBLE)
{
strcpy(A,"LDOUBLE");
break;
}
if(i==vt_DECFUNC)
{
strcpy(A,"DECFUNC");
break;
}
if(i==vt_NUMBER)
{
strcpy(A,"NUMBER");
break;
}
if(i==vt_FILEPTR)
{
strcpy(A,"FILE*");
break;
}
if(i==vt_UDT)
{
strcpy(A,"struct");
break;
}
if(i==vt_STRUCT)
{
strcpy(A,"struct");
break;
}
if(i==vt_UNION)
{
strcpy(A,"union");
break;
}
if(i==vt_BOOL)
{
strcpy(A,"bool");
break;
}
if(i==vt_CHAR)
{
strcpy(A,"char");
break;
}
if(i==vt_CHARPTR)
{
strcpy(A,"char");
break;
}
if(i==vt_PCHAR)
{
strcpy(A,"PCHAR");
break;
}
if(i==vt_VOID)
{
strcpy(A,"void");
break;
}
if(i==vt_LONG)
{
strcpy(A,"long");
break;
}
if(i==vt_DWORD)
{
strcpy(A,"DWORD");
break;
}
if(i==vt_FARPROC)
{
strcpy(A,"FARPROC");
break;
}
if(i==vt_LPBYTE)
{
strcpy(A,"LPBYTE");
break;
}
if(i==vt_LRESULT)
{
strcpy(A,"LRESULT");
break;
}
if(i==vt_BYTE)
{
strcpy(A,"BYTE");
break;
}
if(i==vt_SHORT)
{
strcpy(A,"short");
break;
}
if(i==vt_USHORT)
{
strcpy(A,"USHORT");
break;
}
if(i==vt_COLORREF)
{
strcpy(A,"COLORREF");
break;
}
if(i==vt_UINT)
{
strcpy(A,"UINT");
break;
}
if(i==vt_ULONG)
{
strcpy(A,"ULONG");
break;
}
if(i==vt_HANDLE)
{
strcpy(A,"HANDLE");
break;
}
if(i==vt_HINSTANCE)
{
strcpy(A,"HINSTANCE");
break;
}
if(i==vt_HDC)
{
strcpy(A,"HDC");
break;
}
if(i==vt_VARIANT)
{
strcpy(A,"VARIANT");
break;
}
// case else
{
*A=0;
}
break;
}
return A;
}
int HashNumber (char *HT)
{
char* TT;
ULONG i=0;
TT=HT;
while(*TT)
{
i<<=1;
i ^= *TT;
TT++;
}
return imod(i,MaxGlobalVars);
}
void AddLibrary (char *LibName)
{
static int nTimes;
static int nLibNdx;
memset(&nLibNdx,0,sizeof(nLibNdx));
char TempLibName[2048];
strcpy(TempLibName,lcase(LibName));
if(!inchr(TempLibName,DQ)&&!inchr(TempLibName,"<"))
{
strcpy(TempLibName,enc(TempLibName,60,62));
}
if(nTimes==0)
{
{int i;
for(i=0; i<=MaxLib-1; i+=1)
{
*Library[i]=0;
}
}
nTimes++;
strcpy(Library[0],TempLibName);
return;
}
nLibNdx=0;
while(Library[nLibNdx][0]!=0)
{
if(str_cmp(Library[nLibNdx],TempLibName)==0)
{
return;
}
nLibNdx++;
}
if(nLibNdx<MaxLib-1)
{
strcpy(Library[nLibNdx],TempLibName);
}
}
void RemoveLibrary (char *LibName)
{
if(!instr_b(RmLibs,LibName,1,1))
{
strcpy(RmLibs, join(3,RmLibs,",",lcase(LibName)));
}
}
void EmitLibs (void)
{
static int nTimes;
static int nCount;
char ltmp[2048];
if(nTimes>0)
{
return;
}
nTimes++;
if(Library[0][0]==0)
{
return;
}
fprintf(FP7,"%s\n","");
fprintf(FP7,"%s\n","#ifndef LINUXBCX");
fprintf(FP7,"%s\n","#if !defined( __LCC__ )");
{int i;
for(i=0; i<=MaxLib-1; i+=1)
{
if(Library[i][0]==0&&nCount>0)
{
goto NEXTLIB;
}
else if(Library[i][0]==0)
{
goto NEXTLIB;
}
strcpy(ltmp,Library[i]);
RemoveAll(ltmp,join(2,"<>",DQ));
if(instr_b(RmLibs,ltmp))
{
continue;
}
if(nCount==0)
{
nCount++;
fprintf(FP7,"%s\n","// *************************************************");
fprintf(FP7,"%s\n","// Instruct Linker to Search Object/Import Libraries");
fprintf(FP7,"%s\n","// *************************************************");
}
fprintf(FP7,"%s%s%s\n","#pragma comment(lib,",enc(ltmp),")");
}
}
NEXTLIB:;
fprintf(FP7,"%s\n","#else");
strcat(RmLibs,",<libc.lib>,<kernel32.lib>,<comdlg32.lib>,<user32.lib>,<gdi32.lib>,<advapi32.lib>,<comctl32.lib>,<crtdll.lib>");
{int i;
for(i=0; i<=MaxLib-1; i+=1)
{
if(Library[i][0]==0&&nCount>0)
{
fprintf(FP7,"%s\n","// *************************************************");
fprintf(FP7,"%s\n","// End of Object/Import Libraries To Search");
fprintf(FP7,"%s\n","// *************************************************");
goto LIBEND;
}
else if(Library[i][0]==0)
{
goto LIBEND;
}
if(instr_b(RmLibs,Library[i]))
{
continue;
}
if(nCount==0)
{
nCount++;
fprintf(FP7,"%s\n","");
fprintf(FP7,"%s\n","// *************************************************");
fprintf(FP7,"%s\n","// Instruct Linker to Search Object/Import Libraries");
fprintf(FP7,"%s\n","// *************************************************");
}
fprintf(FP7,"%s%s\n","#pragma lib ",Library[i]);
}
}
LIBEND:;
fprintf(FP7,"%s\n","#endif");
fprintf(FP7,"%s\n","#endif // LINUXBCX not defined");
}
void AddGlobal (char * GlobalName,int GlobalType,int GlobalDef,char * GlobalDim,int GlobalPtr,int GlobalFS,int GlobalExtn,int iEmitted,int iConst)
{
char FirstVar[2048];
char SecondVar[2048];
char Warn[2048];
int ss;
int s;
if(RestrictedWords(GlobalName)&&TestState)
{
strcpy(Warn, join(3,"Restricted Word ",GlobalName," on Line"));
strcpy(Warn, join(4,Warn,str(ModuleLineNos[ModuleNdx])," in Module: ",trim(Modules[ModuleNdx])));
Warning(Warn);
}
ss=HashNumber(GlobalName);
while(GlobalVarHash[ss])
{
s=GlobalVarHash[ss];
if(str_cmp(GlobalName,GlobalVars[s].VarName)==0)
{
if(InConditional==0||(InConditional>0&&str_cmp(InIfDef,GlobalVars[s].VarCondDef)==0))
{
if(GlobalVars[s].VarType!=GlobalType||str_cmp(GlobalDim,GlobalVars[s].VarDim)!=0 || GlobalVars[s].VarDef!=GlobalDef)
{
strcpy(FirstVar, join(11,"Line",str(ModuleLineNos[ModuleNdx])," in Module: ",trim(Modules[ModuleNdx])," : ",GlobalName,GlobalDim," as ",GetVarTypeName(GlobalType)," ",TypeDefs[GlobalDef].VarName));
strcpy(SecondVar, join(11,"Line",str(GlobalVars[s].VarLine)," in Module: ",GlobalVars[s].VarModule," : ",GlobalName,GlobalVars[s].VarDim," as ",GetVarTypeName(GlobalVars[s].VarType)," ",TypeDefs[GlobalVars[s].VarDef].VarName));
strcpy(Warn, join(4,"Two Variables ",FirstVar," previously defined at ",SecondVar));
Warning(Warn);
}
return;
}
}
ss=imod(ss+1,MaxGlobalVars);
}
GlobalVarCnt++;
if(GlobalVarCnt==MaxGlobalVars)
{
Abort("Maximum Global Variables reached.");
}
strcpy(GlobalVars[GlobalVarCnt].VarName,GlobalName);
GlobalVars[GlobalVarCnt].VarType=GlobalType;
GlobalVars[GlobalVarCnt].VarDef=GlobalDef;
strcpy(GlobalVars[GlobalVarCnt].VarDim,GlobalDim);
GlobalVars[GlobalVarCnt].VarLine=ModuleLineNos[ModuleNdx];
GlobalVars[GlobalVarCnt].VarPntr=GlobalPtr;
GlobalVars[GlobalVarCnt].VarSF=GlobalFS;
GlobalVars[GlobalVarCnt].VarEmitFlag=iEmitted;
strcpy(GlobalVars[GlobalVarCnt].VarModule,trim(Modules[ModuleNdx]));
GlobalVars[GlobalVarCnt].VarExtn=GlobalExtn;
GlobalVars[GlobalVarCnt].VarCondLevel=InConditional;
GlobalVars[GlobalVarCnt].VarConstant=iConst;
strcpy(GlobalVars[GlobalVarCnt].VarCondDef,InIfDef);
GlobalVarHash[ss]=GlobalVarCnt;
}
void AddLocal (char * LocalName,int LocalType,int LocalDef,char * LocalDim,int LocalPtr,int LocalFS,int iEmitted,int iConst)
{
int varid=0;
char FirstVar[2048];
char SecondVar[2048];
char Warn[2048];
int s;
if(LocalVarCnt&&TestState)
{
if(CheckGlobal(LocalName, &varid)!=vt_UNKNOWN)
{
if(LocalDef)
{
strcpy(FirstVar, join(9,"Line",str(ModuleLineNos[ModuleNdx])," in Module: ",trim(Modules[ModuleNdx])," : ",LocalName,LocalDim," as ",TypeDefs[LocalDef].VarName));
}
else
{
strcpy(FirstVar, join(9,"Line",str(ModuleLineNos[ModuleNdx])," in Module: ",trim(Modules[ModuleNdx])," : ",LocalName,LocalDim," as ",GetVarTypeName(LocalType)));
}
if(GlobalVars[varid].VarDef)
{
strcpy(SecondVar, join(9,"Line",str(GlobalVars[varid].VarLine)," in Module: ",GlobalVars[varid].VarModule," : ",LocalName,GlobalVars[varid].VarDim," as ",TypeDefs[GlobalVars[varid].VarDef].VarName));
}
else
{
strcpy(SecondVar, join(9,"Line",str(GlobalVars[varid].VarLine)," in Module: ",GlobalVars[varid].VarModule," : ",LocalName,GlobalVars[varid].VarDim," as ",GetVarTypeName(GlobalVars[varid].VarType)));
}
strcpy(Warn, join(5,"Local Variable ",FirstVar,CRLF,"Has Same Name as Global ",SecondVar));
Warning(Warn);
}
for(s=1; s<=LocalVarCnt; s+=1)
{
if(str_cmp(LocalName,LocalVars[s].VarName)==0)
{
if(LocalVars[s].VarType!=LocalType||str_cmp(LocalDim,LocalVars[s].VarDim)!=0 || LocalVars[s].VarDef!=LocalDef)
{
strcpy(FirstVar, join(11,"Line",str(ModuleLineNos[ModuleNdx])," in Module: ",trim(Modules[ModuleNdx])," : ",LocalName,LocalDim," as ",GetVarTypeName(LocalType)," ",TypeDefs[LocalDef].VarName));
strcpy(SecondVar, join(11,"Line",str(LocalVars[s].VarLine)," in Module: ",LocalVars[s].VarModule," : ",LocalName,LocalVars[s].VarDim," as ",GetVarTypeName(LocalVars[s].VarType)," ",TypeDefs[LocalVars[s].VarDef].VarName));
strcpy(Warn, join(4,"Two Variables ",FirstVar," previously defined at ",SecondVar));
Warning(Warn);
}
return;
}
}
}
LocalVarCnt++;
if(LocalVarCnt==MaxLocalVars)
{
strcpy(Warn,"Maximum Local Variables reached.");
Abort(Warn);
}
strcpy(LocalVars[LocalVarCnt].VarName,LocalName);
LocalVars[LocalVarCnt].VarType=LocalType;
LocalVars[LocalVarCnt].VarDef=LocalDef;
strcpy(LocalVars[LocalVarCnt].VarDim,LocalDim);
LocalVars[LocalVarCnt].VarLine=ModuleLineNos[ModuleNdx];
LocalVars[LocalVarCnt].VarPntr=LocalPtr;
LocalVars[LocalVarCnt].VarSF=LocalFS;
LocalVars[LocalVarCnt].VarEmitFlag=iEmitted;
LocalVars[LocalVarCnt].VarConstant=iConst;
strcpy(LocalVars[LocalVarCnt].VarModule,trim(Modules[ModuleNdx]));
}
int IsNumber (char *a)
{
int i=0;
if(!*a)
{
return FALSE;
}
while(a[i])
{
if(a[i]>47&&a[i]<58)
{
i++;
}
else
{
return FALSE;
}
}
return TRUE;
}
int IsNumberEx (char *a)
{
int i=0;
if(!*a)
{
return FALSE;
}
while(a[i])
{
if(a[i]>44&&a[i]<58)
{
i++;
}
else
{
return FALSE;
}
}
return TRUE;
}
void StripTabs (void)
{
int i=0;
while(Src[i])
{
if(Src[i]==9)
{
Src[i]=32;
}
i++;
}
}
void PushFileIO (void)
{
FPtr[++FPtrNdx]=SourceFile;
}
void PopFileIO (void)
{
if(FPtrNdx==0)
{
return;
}
if(SourceFile)
{
fclose(SourceFile);
SourceFile=NULL;
}
LinesRead+=(ModuleLineNos[ModuleNdx--]);
SourceFile=FPtr[FPtrNdx--];
}
int Inset (char *Mane, char *Match)
{
int i=-1;
int j=-1;
while(Match[++i])
{
while(Mane[++j])
{
if(Match[i]==Mane[j])
{
return TRUE;
}
}
j=-1;
}
return FALSE;
}
void CheckParQuotes (void)
{
int CountR=0;
int CountS=0;
int i=0;
bool DoCount=TRUE;
while(Src[i])
{
if(Src[i]==34)
{
DoCount=!DoCount;
}
if(DoCount)
{
if(Src[i]==40)
{
CountR++;
}
else if(Src[i]==41)
{
CountR--;
}
else if(Src[i]==91)
{
CountS++;
}
else if(Src[i]==93)
{
CountS--;
}
}
i++;
}
if(!DoCount)
{
Abort("Unmatched Quotes");
}
else if(CountS)
{
Abort("Unmatched []");
}
else if(CountR)
{
Abort("Unmatched ()");
}
}
void ClearIfThenStacks (void)
{
{int i;
for(i=0; i<=127; i+=1)
{
*SrcStk[i]=0;
}
}
SrcCnt=0;
}
int IsQuoted (char *ZZ)
{
if(!iMatchLft(ltrim(ZZ),DQ))
{
return 0;
}
if(!iMatchRgt(rtrim(ZZ),DQ))
{
return 0;
}
return TRUE;
}
void PostProcess (void)
{
int A;
if(ReDirect==TRUE)
{
if((FP1=fopen(FileOut,"r"))==0)
{
fprintf(stderr,"Can't open file %s\n",FileOut);
exit(1);
}
while(!EoF(FP1))
{
Z[0]=0;
AR_fgets_retval=fgets(Z,65535,FP1);
if(Z[strlen(Z)-1]==10)Z[strlen(Z)-1]=0;
printf("%s\n",Z);
}
CloseAll();
}
strcpy(OutfileClone,FileOut);
for(A=1; A<=EntryCnt; A+=1)
{
strcpy(OutfileClone,extract(OutfileClone,"."));
strcpy(Cmd,RemoveStr(Entry[A],DQ));
strcpy(Cmd,replace(Cmd,"\\\\","\\"));
strcpy(Cmd,iReplace(Cmd,"$file$",extract(OutfileClone,".")));
printf("%s%s\n","Shelling Out To: ",Cmd);
Shell(Cmd);
}
if(Compiler[0]>0)
{
strcpy(Compiler,trim(RemoveStr(Compiler,DQ)));
if(inchr(Compiler," "))
{
strcpy(Compiler, join(3,enc(extract(Compiler," "))," ",remain(Compiler," ")));
}
else
{
strcpy(Compiler,enc(Compiler));
}
strcpy(FileOut, join(2,extract(FileOut,"."),".cc"));
strcpy(Compiler, join(3,Compiler," ",FileOut));
strcpy(Compiler,iReplace(Compiler,"$FILE$",extract(OutfileClone,".")));
strcpy(Compiler,replace(Compiler,"\\\\","\\"));
strcpy(Compiler,replace(Compiler,DDQ,DQ));
printf("%s%s\n","Shelling Out To: ",Compiler);
Shell(Compiler);
}
if(Linker[0]>0)
{
strcpy(Linker,trim(RemoveStr(Linker,DQ)));
if(inchr(Linker," "))
{
strcpy(Linker, join(5,DQ,extract(Linker," "),DQ," ",remain(Linker," ")));
}
else
{
strcpy(Linker,enc(Linker));
}
strcpy(FileOut, join(2,extract(FileOut,"."),".obj"));
strcpy(Linker, join(3,Linker," ",FileOut));
strcpy(Linker,iReplace(Linker,"$FILE$",extract(OutfileClone,".")));
strcpy(Linker,replace(Linker,"\\\\","\\"));
strcpy(Linker,replace(Linker,DDQ,DQ));
printf("%s%s\n","Shelling Out To:",Linker);
Shell(Linker);
}
for(A=1; A<=XitCount; A+=1)
{
strcpy(FileOut,extract(FileOut,"."));
strcpy(Cmd,RemoveStr(Xit[A],DQ));
strcpy(Cmd,iReplace(Cmd,"$FILE$",extract(OutfileClone,".")));
strcpy(Cmd,replace(Cmd,"\\\\","\\"));
strcpy(Cmd,replace(Cmd,DDQ,DQ));
printf("%s%s\n","Shelling Out To: ",Cmd);
Shell(Cmd);
}
}
void XParse (char *Arg)
{
char lszTmp[2048];
int j;
int i=0;
int Gapflag=0;
int InIF=0;
if(str_cmp(trim(Arg),"")==0)
{
Ndx=0;
return;
}
i=iMatchNQ(Arg,"&&");
while(i)
{
strcpy(Arg,del(Arg,i,2));
strcpy(Arg,ins(Arg,i," and "));
i=iMatchNQ(Arg,"&&");
}
FastLexer(Arg,SPC,"=&()[]{}',+-*/<>?;.|:^");
while(++i<17)
{
*Stk[i+Ndx]=0;
}
for(i=1; i<=Ndx; i+=1)
{
strcpy(Keyword1,lcase(Stk[i]));
if(Keyword1[1]!=0)
{
for(;;)
{
if(str_cmp(Keyword1,"and")==0)
{
strcpy(Stk[i],"&&");
break;
}
if(str_cmp(Keyword1,"or")==0)
{
strcpy(Stk[i],"||");
break;
}
if(str_cmp(Keyword1,"not")==0)
{
strcpy(Stk[i],"!");
break;
}
if(str_cmp(Keyword1,"is")==0)
{
strcpy(Stk[i],"=");
break;
}
if(str_cmp(Keyword1,"xor")==0)
{
strcpy(Stk[i],"xor");
break;
}
if(str_cmp(Keyword1,"if")==0 || str_cmp(Keyword1,"iif")==0 || str_cmp(Keyword1,"iif$")==0 || str_cmp(Keyword1,"case")==0 || str_cmp(Keyword1,"elseif")==0 || str_cmp(Keyword1,"while")==0)
{
InIF=1;
break;
}
if(str_cmp(Keyword1,"then")==0)
{
InIF=0;
break;
}
if(str_cmp(Keyword1,"byval")==0)
{
*Stk[i]=0;
Gapflag=TRUE;
break;
}
if(str_cmp(Keyword1,"byref")==0)
{
if(!iMatchWrd(Stk[1],"declare")&&!iMatchWrd(Stk[1],"c_declare"))
{
strcpy(ByrefVars[++ByrefCnt],Stk[i+1]);
}
for(j=i; j<=Ndx; j+=1)
{
if(str_cmp(Stk[j+1],",")==0 || str_cmp(Stk[j+1],")")==0)
{
strcpy(Stk[j],"PTR");
break;
}
strcpy(Stk[j],Stk[j+1]);
}
break;
}
// case else
{
if(PassOne)
{
if(str_cmp(Keyword1,enc(chr(92)))==0)
{
strcpy(Stk[i],"chr$");
InsertTokens(i,3,"(","92",")");
i+=(3);
}
else if(TranslateSlash)
{
strcpy(Stk[i],replace(Stk[i],"\\","\\\\"));
}
}
}
break;
}
if(!InIF)
{
if(str_cmp(Stk[i],"&&")==0)
{
strcpy(Stk[i],"BAND");
}
else if(str_cmp(Stk[i],"||")==0)
{
strcpy(Stk[i],"BOR");
}
}
}
else
{
for(;;)
{
if((UCHAR)*(Keyword1)==38)
{
if(i<3||inchr("+&,(=",Stk[i-1]))
{
strcpy(Stk[i+1], join(2," &",Stk[i+1]));
*Stk[i]=0;
Gapflag=TRUE;
}
break;
}
if((UCHAR)*(Keyword1)==63)
{
strcpy(Stk[i],"print");
break;
}
if((UCHAR)*(Keyword1)==45)
{
if((UCHAR)*(Stk[i+1])==62)
{
strcpy(Stk[i], join(2,"->",Stk[i+2]));
*Stk[++i]=0;
*Stk[++i]=0;
Gapflag=TRUE;
}
break;
}
if((UCHAR)*(Keyword1)==46)
{
if(IsNumber(Stk[i-1]))
{
strcpy(Stk[i], join(2,Stk[i-1],"."));
*Stk[i-1]=0;
Gapflag=TRUE;
}
if(!inchr(",)=<>*/+-^",Stk[i+1]))
{
strcpy(Stk[i], join(2,Stk[i],Stk[i+1]));
*Stk[++i]=0;
Gapflag=TRUE;
}
}
break;
}
}
}
if(Gapflag)
{
for(i=1; i<=Ndx; i+=1)
{
if(!*Stk[i])
{
j=i+1;
while(!*Stk[j]&&(j<Ndx))
{
j++;
}
if(!*Stk[j])
{
break;
}
strcpy(Stk[i],Stk[j]);
*Stk[j]=0;
}
}
Ndx=i-1;
}
if(PassOne==1)
{
if(InFunc)
{
for(i=1; i<=Ndx; i+=1)
{
for(j=1; j<=ByrefCnt; j+=1)
{
if(iMatchLft(Stk[i]," &"))
{
strcpy(lszTmp,Stk[i]+2);
}
else
{
strcpy(lszTmp,Stk[i]);
}
if(str_cmp(Clean(lszTmp),Clean(ByrefVars[j]))==0)
{
if(i>2)
{
if(inchr("+-^%*/|&<=>,",Stk[i-2])&&str_cmp(Stk[i-1],"*")==0)
{
*Stk[i-1]=0;
}
if(iMatchLft(Stk[i]," &"))
{
strcpy(Stk[i],Stk[i]+2);
break;
}
}
else if(i==2)
{
if(str_cmp(Stk[i-1],"*")==0)
{
*Stk[i-1]=0;
}
}
strcpy(Stk[i], join(2,"*",Stk[i]));
if(str_cmp(Stk[i-1],"(")!=0 || str_cmp(Stk[i+1],")")!=0)
{
strcpy(Stk[i],enc(Stk[i],40,41));
}
break;
}
}
}
}
}
if(iMatchWrd(Stk[1],"dim"))
{
if(iMatchWrd(Stk[Ndx-1],"static"))
{
strcpy(Stk[1],"static");
strcpy(Stk[Ndx-1],Stk[Ndx]);
Ndx--;
}
}
strcpy(Keyword1,lcase(Stk[1]));
if(InTypeDef)
{
if(str_cmp(Keyword1,"end")!=0 && str_cmp(Keyword1,"dim")!=0 && str_cmp(Keyword1,"declare")!=0 && str_cmp(Keyword1,"type")!=0 && str_cmp(Keyword1,"union")!=0)
{
InsertTokens(0,1,"dim");
}
}
if(!InTypeDef)
{
char lsz[2048];
int Res=1;
strcpy(lsz, join(3,SPC,Keyword1,SPC));
if(iMatchNQ(" dim , local , global , raw , static , shared , dynamic , auto , register , extern ",lsz))
{
Res=1;
}
strcpy(lsz, join(3,SPC,lcase(Stk[2]),SPC));
if(iMatchNQ(" dim , local , global , raw , static , shared , dynamic , auto , register , extern ",lsz))
{
Res=2;
}
if(Res>0)
{
i=Ndx;
while(i>1&&str_cmp(Stk[i],")")!=0)
{
if(iMatchWrd(Stk[i],"as"))
{
if(iMatchWrd(Stk[i+1],"function"))
{
if(i+1==Ndx)
{
*Stk[i]=0;
}
*Stk[i+1]=0;
InsertTokens(Res,1,"function");
}
else if(iMatchWrd(Stk[i+1],"sub"))
{
if(i+1==Ndx)
{
*Stk[i]=0;
}
*Stk[i+1]=0;
InsertTokens(Res,1,"sub");
}
RemEmptyTokens();
break;
}
i--;
}
}
}
if(InTypeDef||iMatchWrd(Stk[1],"declare")||iMatchWrd(Stk[1],"c_declare"))
{
if(iMatchWrd(Stk[2],"sub")||iMatchWrd(Stk[2],"function"))
{
{int i;
for(i=2; i<=Ndx; i+=1)
{
if(iMatchLft(Stk[i],"as")&&iMatchWrd(Stk[i+1],"string"))
{
if(*Stk[i+2]!=42)
{
strcpy(Stk[i+1],"char *");
}
}
}
}
}
}
}
void TokenSubstitutions (void)
{
int A;
int CompPtr;
int CompToken;
char Keyword[2048];
int a;
int i;
int j;
int Tmp;
for(i=1; i<=Ndx; i+=1)
{
if(iMatchWrd(Stk[i],"as"))
{
if(iMatchWrd(Stk[i+1],"string"))
{
if(str_cmp(Stk[i+2],"*")==0)
{
strcpy(Stk[i],"[");
strcpy(Stk[i+1],Stk[i+3]);
strcpy(Stk[i+2],"]");
strcpy(Stk[i+3],"as");
Ndx++;
strcpy(Stk[Ndx],"char");
break;
}
}
}
}
for(i=1; i<=Ndx; i+=1)
{
if(!InFunc)
{
if(iMatchWrd(Stk[i],"global"))
{
strcpy(Stk[i],"dim");
}
}
}
A=FALSE;
for(Tmp=1; Tmp<=Ndx; Tmp+=1)
{
if(*Stk[Tmp]==48&&Stk[Tmp][1]!=120&&Stk[Tmp][1]!=108)
{
strcpy(Stk[Tmp],ltrim(Stk[Tmp],48));
if(Stk[Tmp][0]==0)
{
strcpy(Stk[Tmp],"0");
}
}
if(iMatchWrd(Stk[Tmp],"xor"))
{
strcpy(Stk[Tmp],"^");
}
else if(str_cmp(Stk[Tmp],"=")==0 && str_cmp(Stk[Tmp+1],">")==0)
{
strcpy(Stk[Tmp],">");
strcpy(Stk[Tmp+1],"=");
}
else if(str_cmp(Stk[Tmp],"=")==0 && str_cmp(Stk[Tmp+1],"<")==0)
{
strcpy(Stk[Tmp],"<");
strcpy(Stk[Tmp+1],"=");
}
else if(str_cmp(Stk[Tmp],"<")==0 && str_cmp(Stk[Tmp+1],">")==0)
{
strcpy(Stk[Tmp],"!=");
*Stk[Tmp+1]=0;
A=TRUE;
}
else if(str_cmp(Stk[Tmp],">")==0 && str_cmp(Stk[Tmp+1],"<")==0)
{
strcpy(Stk[Tmp],"!=");
*Stk[Tmp+1]=0;
A=TRUE;
}
else if(str_cmp(Stk[Tmp],"!")==0 && str_cmp(Stk[Tmp+1],"=")==0)
{
strcpy(Stk[Tmp],"!=");
*Stk[Tmp+1]=0;
A=TRUE;
}
}
if(A==TRUE)
{
RemEmptyTokens();
}
CompToken=0;
for(Tmp=1; Tmp<=Ndx; Tmp+=1)
{
A=CheckLocal(Stk[Tmp], &i);
if(A==vt_UNKNOWN)
{
A=CheckGlobal(Stk[Tmp], &i);
}
if(A==vt_STRUCT||A==vt_UDT||A==vt_UNION)
{
CompToken=1;
}
if(iMatchWrd(Stk[Tmp],"int")&&str_cmp(Stk[Tmp+1],"(")==0)
{
strcpy(Stk[Tmp],"fint");
}
else if(iMatchWrd(Stk[Tmp],"integer"))
{
strcpy(Stk[Tmp],"int");
}
else if(iMatchWrd(Stk[Tmp],"fint")&&str_cmp(Stk[Tmp+1],")")==0)
{
strcpy(Stk[Tmp],"int");
}
}
CompPtr=0;
for(Tmp=1; Tmp<=Ndx; Tmp+=1)
{
strcpy(Keyword,lcase(Stk[Tmp]));
a=inchr("abcdefghijklmnopqrstuvwxyz",Keyword);
for(;;)
{
if(a==1)
{
for(;;)
{
if(str_cmp(Keyword,"abs")==0)
{
strcpy(Stk[Tmp],"abs");
break;
}
if(str_cmp(Keyword,"acos")==0)
{
strcpy(Stk[Tmp],"acos");
break;
}
if(str_cmp(Keyword,"acosl")==0)
{
strcpy(Stk[Tmp],"acosl");
break;
}
if(str_cmp(Keyword,"acosh")==0)
{
strcpy(Stk[Tmp],"acosh");
break;
}
if(str_cmp(Keyword,"appexename$")==0)
{
strcpy(Stk[Tmp],"AppExeName$()");
Use_AppExeName=Use_BcxSplitPath=UseFlag=TRUE;
break;
}
if(str_cmp(Keyword,"appexepath$")==0)
{
strcpy(Stk[Tmp],"AppExePath$()");
if(str_cmp(Stk[Tmp+1],"(")==0 && str_cmp(Stk[Tmp+2],")")==0)
{
*Stk[Tmp+1]=0;
*Stk[Tmp+2]=0;
}
Use_AppExePath=Use_BcxSplitPath=UseFlag=TRUE;
break;
}
if(str_cmp(Keyword,"ansitowide")==0)
{
strcpy(Stk[Tmp],"AnsiToWide");
Use_AnsiToWide=UseFlag=TRUE;
break;
}
if(str_cmp(Keyword,"argc")==0)
{
strcpy(Stk[Tmp],"argc");
break;
}
if(str_cmp(Keyword,"argv")==0)
{
strcpy(Stk[Tmp],"argv");
break;
}
if(str_cmp(Keyword,"argv$")==0)
{
strcpy(Stk[Tmp],"argv$");
break;
}
if(str_cmp(Keyword,"asc")==0)
{
i=0;
j=GetNumArgs(Tmp+2, &i);
if(*Stk[Tmp+2]==*DQ)
{
if(j>0||*Stk[Tmp+3]!=41)
{
strcpy(Stk[Tmp],"asc");
Use_Asc=TRUE;
}
else
{
if(str_cmp(Stk[Tmp+2],DDQ)==0)
{
strcpy(Stk[Tmp],"0");
}
else
{
strcpy(Stk[Tmp],ltrim(str((UCHAR)*(Stk[Tmp+2]+1))));
}
*Stk[Tmp+1]=0;
*Stk[Tmp+2]=0;
*Stk[Tmp+3]=0;
}
}
else
{
if(j>0)
{
strcpy(Stk[i],"+");
}
strcpy(Stk[Tmp],"(UCHAR)*");
}
break;
}
if(str_cmp(Keyword,"asin")==0)
{
strcpy(Stk[Tmp],"asin");
break;
}
if(str_cmp(Keyword,"asinl")==0)
{
strcpy(Stk[Tmp],"asinl");
break;
}
if(str_cmp(Keyword,"asinh")==0)
{
strcpy(Stk[Tmp],"asinh");
break;
}
if(str_cmp(Keyword,"atanh")==0)
{
strcpy(Stk[Tmp],"atanh");
break;
}
if(str_cmp(Keyword,"atn")==0 || str_cmp(Keyword,"atan")==0)
{
strcpy(Stk[Tmp],"atan");
break;
}
if(str_cmp(Keyword,"atnl")==0 || str_cmp(Keyword,"atanl")==0)
{
strcpy(Stk[Tmp],"atanl");
break;
}
if(str_cmp(Keyword,"auto")==0)
{
if(iMatchWrd(Stk[Tmp+1],"local"))
{
strcpy(Stk[Tmp],"dim");
strcpy(Stk[Tmp+1],"raw");
}
else
{
strcpy(Stk[Tmp],"auto");
}
}
break;
}
break;
}
if(a==2)
{
for(;;)
{
if(str_cmp(Keyword,"bcopy")==0)
{
*Stk[1]=0;
for(i=Tmp+1; i<=Ndx; i+=1)
{
if(iMatchWrd(Stk[i],"to"))
{
break;
}
strcat(Stk[1],Stk[i]);
}
*Stk[2]=0;
for(i=i+1; i<=Ndx; i+=1)
{
strcat(Stk[2],Stk[i]);
}
strcpy(Src, join(7,"memmove(&",Stk[2],",&",Stk[1],",sizeof(",Stk[2],"))"));
strcpy(Src,RemoveStr(Src,"&*"));
Ndx=0;
XParse(Src);
break;
}
if(str_cmp(Keyword,"bel$")==0)
{
strcpy(Stk[Tmp],"BEL$");
Use_BEL=UseFlag=TRUE;
break;
}
if(str_cmp(Keyword,"bs$")==0)
{
strcpy(Stk[Tmp],"BS$");
Use_BS=UseFlag=TRUE;
break;
}
if(str_cmp(Keyword,"bool")==0 || str_cmp(Keyword,"boolean")==0)
{
strcpy(Stk[Tmp],"bool");
break;
}
if(str_cmp(Keyword,"band")==0)
{
strcpy(Stk[Tmp]," BAND ");
Use_Band=TRUE;
break;
}
if(str_cmp(Keyword,"bnot")==0)
{
strcpy(Stk[Tmp]," BNOT ");
Use_Bnot=TRUE;
break;
}
if(str_cmp(Keyword,"bcx_font")==0)
{
strcpy(Stk[Tmp],ucase(Stk[Tmp]));
char tmp[2048];
strcpy(tmp,Clean(ucase(Stk[Tmp+1])));
for(;;)
{
if(str_cmp(tmp,".NAME")==0)
{
strcpy(Stk[Tmp+1],".lf.lfFaceName$");
break;
}
if(str_cmp(tmp,".BOLD")==0)
{
strcpy(Stk[Tmp+1],".lf.lfWeight");
break;
}
if(str_cmp(tmp,".UNDERLINE")==0)
{
strcpy(Stk[Tmp+1],".lf.lfUnderline");
break;
}
if(str_cmp(tmp,".STRIKEOUT")==0)
{
strcpy(Stk[Tmp+1],".lf.lfStrikeOut");
break;
}
if(str_cmp(tmp,".ITALIC")==0)
{
strcpy(Stk[Tmp+1],".lf.lfItalic");
break;
}
if(str_cmp(tmp,".CHARSET")==0)
{
strcpy(Stk[Tmp+1],".lf.lfCharSet");
break;
}
if(str_cmp(tmp,".SIZE")==0 || str_cmp(tmp,".RGB")==0)
{
strcpy(Stk[Tmp+1],tmp);
break;
}
// case else
{
strcpy(Stk[Tmp+1],Clean(Stk[Tmp+1]));
}
break;
}
break;
}
if(str_cmp(Keyword,"bcxsplitpath$")==0)
{
strcpy(Stk[Tmp],"$$BcxSplitPath$");
Use_BcxSplitPath=UseFlag=TRUE;
break;
}
if(str_cmp(Keyword,"bcxpath$")==0)
{
UseFlag=TRUE;
strcpy(Stk[Tmp],"BcxPath$()");
if(str_cmp(Stk[Tmp+1],"(")==0 && str_cmp(Stk[Tmp+2],")")==0)
{
*Stk[Tmp+1]=0;
*Stk[Tmp+2]=0;
}
break;
}
if(str_cmp(Keyword,"bcxfont")==0)
{
strcpy(Stk[Tmp],"BcxFont");
break;
}
if(str_cmp(Keyword,"bcxsocket")==0)
{
strcpy(Stk[Tmp],"BcxSocket");
Use_Socket=TRUE;
break;
}
if(str_cmp(Keyword,"bcxsocketsend")==0)
{
strcpy(Stk[Tmp],"BcxSocketSend");
break;
}
if(str_cmp(Keyword,"bcxsocketread")==0)
{
strcpy(Stk[Tmp],"BcxSocketRead");
break;
}
if(str_cmp(Keyword,"bcxsocketclose")==0)
{
strcpy(Stk[Tmp],"BcxSocketClose");
break;
}
if(str_cmp(Keyword,"bcx_thread")==0 || str_cmp(Keyword,"bcx_threadwait")==0 || str_cmp(Keyword,"bcx_threadsuspend")==0 || str_cmp(Keyword,"bcx_threadresume")==0 || str_cmp(Keyword,"bcx_threadkill")==0 || str_cmp(Keyword,"bcx_threadend")==0)
{
strcpy(Stk[Tmp],ucase(Stk[Tmp]));
Use_Threads=TRUE;
break;
}
if(str_cmp(Keyword,"bin$")==0)
{
strcpy(Stk[Tmp],"$$Bin$");
Use_Bin=UseFlag=TRUE;
break;
}
if(str_cmp(Keyword,"bool$")==0)
{
strcpy(Stk[Tmp],"$$BoolStr$");
Use_Boolstr=UseFlag=TRUE;
break;
}
if(str_cmp(Keyword,"bin2dec")==0)
{
strcpy(Stk[Tmp],"Bin2Dec");
Use_Bin2dec=TRUE;
break;
}
if(str_cmp(Keyword,"boolean")==0)
{
strcpy(Stk[Tmp],"BOOLEAN");
break;
}
if(str_cmp(Keyword,"bor")==0)
{
strcpy(Stk[Tmp]," BOR ");
Use_Bor=TRUE;
break;
}
if(str_cmp(Keyword,"byte")==0)
{
strcpy(Stk[Tmp],"BYTE");
}
break;
}
break;
}
if(a==3)
{
for(;;)
{
if(str_cmp(Keyword,"containedin")==0)
{
strcpy(Stk[Tmp],"containedin");
Use_ContainedIn=TRUE;
break;
}
if(str_cmp(Keyword,"copyfile")==0)
{
Use_CopyFile=TRUE;
Use_Exist=Use_Lof=TRUE;
break;
}
if(str_cmp(Keyword,"cr$")==0)
{
strcpy(Stk[Tmp],"CR$");
Use_CR=UseFlag=TRUE;
break;
}
if(str_cmp(Keyword,"close#")==0)
{
strcpy(Stk[Tmp],"close");
break;
}
if(str_cmp(Keyword,"close")==0)
{
if(str_cmp(left(Stk[Tmp+1],1),"#")==0)
{
strcpy(Stk[Tmp+1],mid(Stk[Tmp+1],2));
}
break;
}
if(str_cmp(Keyword,"cvd")==0)
{
strcpy(Stk[Tmp],"CVD");
Use_Cvd=TRUE;
break;
}
if(str_cmp(Keyword,"cvi")==0)
{
strcpy(Stk[Tmp],"CVI");
Use_Cvi=TRUE;
break;
}
if(str_cmp(Keyword,"cvl")==0)
{
strcpy(Stk[Tmp],"CVL");
Use_Cvl=TRUE;
break;
}
if(str_cmp(Keyword,"cvld")==0)
{
strcpy(Stk[Tmp],"CVLD");
Use_Cvld=TRUE;
break;
}
if(str_cmp(Keyword,"cvs")==0)
{
strcpy(Stk[Tmp],"CVS");
Use_Cvs=TRUE;
break;
}
if(str_cmp(Keyword,"concat")==0)
{
strcpy(Stk[Tmp],"strcat");
break;
}
if(str_cmp(Keyword,"chr$")==0)
{
strcpy(Stk[Tmp],"$$chr$");
Use_Chr=UseFlag=TRUE;
break;
}
if(str_cmp(Keyword,"char")==0)
{
strcpy(Stk[Tmp],"char");
break;
}
if(str_cmp(Keyword,"crlf$")==0)
{
strcpy(Stk[Tmp],"CRLF$");
Use_Crlf=UseFlag=TRUE;
break;
}
if(str_cmp(Keyword,"cbctl")==0)
{
strcpy(Stk[Tmp],"LOWORD(wParam)");
break;
}
if(str_cmp(Keyword,"cbctlmsg")==0)
{
strcpy(Stk[Tmp],"HIWORD(wParam)");
break;
}
if(str_cmp(Keyword,"cblparam")==0)
{
strcpy(Stk[Tmp],"lParam");
break;
}
if(str_cmp(Keyword,"cbmsg")==0)
{
strcpy(Stk[Tmp],"Msg");
break;
}
if(str_cmp(Keyword,"cbwparam")==0)
{
strcpy(Stk[Tmp],"wParam");
break;
}
if(str_cmp(Keyword,"cdbl")==0)
{
strcpy(Stk[Tmp],"CDBL");
Use_Cdbl=TRUE;
break;
}
if(str_cmp(Keyword,"chdrive")==0 || str_cmp(Keyword,"chdir")==0)
{
strcpy(Stk[Tmp],"chdir");
break;
}
if(str_cmp(Keyword,"cint")==0)
{
strcpy(Stk[Tmp],"Cint");
Use_Cint=TRUE;
break;
}
if(str_cmp(Keyword,"cldbl")==0)
{
strcpy(Stk[Tmp],"CLDBL");
Use_Cldbl=TRUE;
break;
}
if(str_cmp(Keyword,"clng")==0)
{
strcpy(Stk[Tmp],"CLNG");
Use_Clng=TRUE;
break;
}
if(str_cmp(Keyword,"cls")==0)
{
strcpy(Stk[Tmp],"cls");
Use_Cls=Use_ESC=TRUE;
break;
}
if(str_cmp(Keyword,"color")==0 || str_cmp(Keyword,"color_fg")==0 || str_cmp(Keyword,"color_bg")==0)
{
strcpy(Stk[Tmp],lcase(Stk[Tmp]));
Use_Color=Use_Console=TRUE;
break;
}
if(str_cmp(Keyword,"command$")==0)
{
Use_Command=Use_SPC=UseFlag=TRUE;
strcpy(Stk[Tmp],"command$(-1)");
if(str_cmp(Stk[Tmp+1],"(")==0)
{
strcpy(Stk[Tmp],"command$");
}
break;
}
if(str_cmp(Keyword,"colorref")==0)
{
strcpy(Stk[Tmp],"COLORREF");
break;
}
if(str_cmp(Keyword,"cos")==0)
{
strcpy(Stk[Tmp],"cos");
break;
}
if(str_cmp(Keyword,"cosl")==0)
{
strcpy(Stk[Tmp],"cosl");
break;
}
if(str_cmp(Keyword,"cosh")==0)
{
strcpy(Stk[Tmp],"cosh");
break;
}
if(str_cmp(Keyword,"cbool")==0)
{
strcpy(Stk[Tmp],"CBOOL");
static struct _functionParse fp;
memset(&fp,0,sizeof(fp));
static int i;
memset(&i,0,sizeof(i));
static int t;
memset(&t,0,sizeof(t));
static int expos=0;
memset(&expos,0,sizeof(expos));
if(SepFuncArgs(Tmp+1, &fp,TRUE)==0)
{
Abort("No argument specified in CBOOL");
}
for(i=fp.CommaPos[0]; i<=fp.CommaPos[1]; i+=1)
{
t=inchr("!<>=",Stk[i]);
if(t)
{
if(t<4)
{
if(str_cmp(Stk[i+1],"=")==0)
{
strcpy(Stk[i], join(2,Stk[i],Stk[i+1]));
*Stk[i+1]=0;
}
else if(t==1&&str_cmp(Stk[i],"!=")!=0)
{
continue;
}
}
else
{
if(str_cmp(Stk[i+1],"=")!=0)
{
strcpy(Stk[i],"==");
}
}
expos=i;
break;
}
}
t=DataType(Stk[expos-1]);
if(t==vt_STRLIT||t==vt_STRVAR)
{
if(expos)
{
strcpy(Stk[Tmp+1], join(2,Stk[Tmp+1],"strcmp("));
strcpy(Stk[fp.CommaPos[1]], join(3,")",Stk[expos],"0)"));
strcpy(Stk[expos],",");
*Src=0;
for(i=1; i<=Ndx; i+=1)
{
strcpy(Src, join(3,Src,Stk[i],SPC));
}
FastLexer(Src," ","(),");
}
}
break;
}
if(str_cmp(Keyword,"csng")==0)
{
strcpy(Stk[Tmp],"CSNG");
Use_Csng=TRUE;
break;
}
if(str_cmp(Keyword,"curdir$")==0)
{
strcpy(Stk[Tmp],"curdir$()");
if(str_cmp(Stk[Tmp+1],"(")==0 && str_cmp(Stk[Tmp+2],")")==0)
{
*Stk[Tmp+1]=0;
*Stk[Tmp+2]=0;
}
Use_Curdir=UseFlag=TRUE;
break;
}
if(str_cmp(Keyword,"currency")==0)
{
strcpy(Stk[Tmp],"CURRENCY");
break;
}
if(str_cmp(Keyword,"c_declare")==0)
{
strcpy(CallType,"__attribute__((cdecl)) ");
strcpy(Stk[Tmp],"declare");
if(iMatchWrd(Stk[4],"lib"))
{
NoTypeDeclare=FALSE;
}
else
{
NoTypeDeclare=TRUE;
}
}
break;
}
break;
}
if(a==4)
{
for(;;)
{
if(str_cmp(Keyword,"declare")==0)
{
strcpy(CallType,"__attribute__((stdcall)) ");
strcpy(Stk[Tmp],"declare");
if(!iMatchWrd(Stk[4],"lib"))
{
NoTypeDeclare=TRUE;
}
else
{
NoTypeDeclare=FALSE;
}
break;
}
if(str_cmp(Keyword,"dq$")==0)
{
strcpy(Stk[Tmp],"DQ$");
Use_DQ=UseFlag=TRUE;
break;
}
if(str_cmp(Keyword,"ddq$")==0)
{
strcpy(Stk[Tmp],"DDQ$");
Use_DDQ=UseFlag=TRUE;
break;
}
if(str_cmp(Keyword,"data$")==0)
{
strcpy(Stk[Tmp],"DATA$");
break;
}
if(str_cmp(Keyword,"date$")==0)
{
strcpy(Stk[Tmp],"$$timef$(12)");
Use_Time=UseFlag=TRUE;
break;
}
if(str_cmp(Keyword,"delete")==0)
{
if(UseCpp==FALSE)
{
Abort("'DELETE' can only be used with C++");
}
strcpy(Stk[Tmp],"delete ");
break;
}
if(str_cmp(Keyword,"del$")==0)
{
strcpy(Stk[Tmp],"del$");
Use_Del=UseFlag=TRUE;
break;
}
if(str_cmp(Keyword,"double")==0)
{
strcpy(Stk[Tmp],"double");
break;
}
if(str_cmp(Keyword,"download")==0)
{
strcpy(Stk[Tmp],"Download");
Use_Download=Use_Dynacall=TRUE;
break;
}
if(str_cmp(Keyword,"dsplit")==0)
{
strcpy(Stk[Tmp],"DSplit");
Use_DSplit=TRUE;
Use_Remove=TRUE;
Use_StrStr=TRUE;
Use_Mid=TRUE;
Use_Left=TRUE;
Use_Instr=TRUE;
Use_Stristr=TRUE;
UseLCaseTbl=TRUE;
UseFlag=TRUE;
break;
}
if(str_cmp(Keyword,"dword")==0)
{
strcpy(Stk[Tmp],"DWORD");
}
break;
}
break;
}
if(a==5)
{
for(;;)
{
if(str_cmp(Keyword,"extern")==0)
{
strcpy(Stk[Tmp],"extern");
break;
}
if(str_cmp(Keyword,"enc$")==0)
{
strcpy(Stk[Tmp],"$$enc$");
Use_Enclose=UseFlag=TRUE;
break;
}
if(str_cmp(Keyword,"extract$")==0)
{
strcpy(Stk[Tmp],"$$extract$");
Use_Extract=Use_StrStr=UseFlag=TRUE;
break;
}
if(str_cmp(Keyword,"eof$")==0)
{
strcpy(Stk[Tmp],"EF$");
Use_EOF=UseFlag=TRUE;
break;
}
if(str_cmp(Keyword,"eof")==0)
{
strcpy(Stk[Tmp],"EoF");
Use_Eof=UseFlag=TRUE;
if(DataType(Stk[Tmp+2])==vt_NUMBER)
{
strcpy(Stk[Tmp+2], join(2,"FP",Stk[Tmp+2]));
}
break;
}
if(str_cmp(Keyword,"esc$")==0)
{
strcpy(Stk[Tmp],"ESC$");
Use_ESC=UseFlag=TRUE;
break;
}
if(str_cmp(Keyword,"enum")==0)
{
if(Ndx==1||iMatchWrd(Stk[3],"enum"))
{
Use_EnumFile=TRUE;
int EnumFlag=FALSE;
fprintf(FP11,"%s\n","");
if(Ndx==1)
{
fprintf(FP11,"%s\n","enum");
}
else
{
fprintf(FP11,"%s%s\n","enum ",Stk[1]);
}
fprintf(FP11,"%s\n"," {");
*Src=0;
while(!iMatchLft(Src,"end "))
{
if(EoF(SourceFile))
{
Abort("Unbalanced ENUM");
}
Src[0]=0;
AR_fgets_retval=fgets(Src,65535,SourceFile);
if(Src[strlen(Src)-1]==10)Src[strlen(Src)-1]=0;
ModuleLineNos[ModuleNdx]++;
StripCode(Src);
if(iMatchLft(Src,"$comme"))
{
Directives();
continue;
}
strcpy(Src,trim(Src));
if(Src[0]==0)
{
continue;
}
if(str_cmp(lcase(left(join(2,Src," "),4)),"end ")==0)
{
break;
}
else
{
if(EnumFlag==FALSE)
{
EnumFlag=TRUE;
}
else
{
fprintf(FP11,"%s\n",",");
}
}
fprintf(FP11,"%s%s"," ",rtrim(Src));
}
*Src=0;
Ndx=0;
fprintf(FP11,"%s\n","");
fprintf(FP11,"%s\n"," };\n");
return;
}
strcpy(Stk[1],"enum {");
for(j=2; j<=Ndx; j+=1)
{
strcat(Stk[1],Stk[j]);
}
strcat(Stk[1],"}");
Ndx=1;
break;
}
if(str_cmp(Keyword,"environ$")==0)
{
strcpy(Stk[Tmp],"Environ$");
Use_Environ=UseFlag=TRUE;
break;
}
if(str_cmp(Keyword,"exist")==0)
{
strcpy(Stk[Tmp],"Exist");
Use_Exist=UseFlag=TRUE;
break;
}
if(str_cmp(Keyword,"exp")==0)
{
strcpy(Stk[Tmp],"Exp");
Use_Exp=TRUE;
}
break;
}
break;
}
if(a==6)
{
for(;;)
{
if(str_cmp(Keyword,"freeglobals")==0)
{
strcpy(Stk[Tmp],"FreeGlobals");
break;
}
if(str_cmp(Keyword,"ff$")==0)
{
strcpy(Stk[Tmp],"FF$");
Use_FF=UseFlag=TRUE;
break;
}
if(str_cmp(Keyword,"function")==0)
{
if(str_cmp(Stk[Tmp+1],"=")==0)
{
if(str_cmp(Stk[Tmp+2],DDQ)==0)
{
strcpy(Stk[Tmp+2],"NUL$");
}
strcpy(Stk[Tmp],"functionreturn");
}
break;
}
if(str_cmp(Keyword,"false")==0)
{
strcpy(Stk[Tmp],"FALSE");
break;
}
if(str_cmp(Keyword,"file")==0)
{
strcpy(Stk[Tmp],"FILE");
break;
}
if(str_cmp(Keyword,"findintype")==0)
{
strcpy(Stk[Tmp],"FindInType");
Use_FindInType=TRUE;
char StMem[2048];
char StName[2048];
char VarName[2048];
static struct _functionParse fp;
memset(&fp,0,sizeof(fp));
SepFuncArgs(Tmp, &fp,TRUE);
strcpy(StMem,remain(Clean(GetArg(2, &fp)),"."));
strcpy(VarName,extract(Clean(GetArg(2, &fp)),"."));
for(j=fp.CommaPos[1]+1; j<=fp.CommaPos[2]-1; j+=1)
{
*Stk[j]=0;
}
if(CheckLocal(VarName, &i)!=vt_UNKNOWN)
{
strcpy(StName,TypeDefs[LocalVars[i].VarDef].VarName);
}
else if(CheckGlobal(VarName, &i)!=vt_UNKNOWN)
{
strcpy(StName,TypeDefs[GlobalVars[i].VarDef].VarName);
}
j=fp.CommaPos[1]+1;
strcpy(Stk[j], join(9,"(char*)",VarName," + offsetof(",StName,",",StMem,"), sizeof(",StName,")"));
break;
}
if(str_cmp(Keyword,"farproc")==0)
{
strcpy(Stk[Tmp],"FARPROC");
break;
}
if(str_cmp(Keyword,"fillarray")==0)
{
strcpy(Stk[Tmp],"fillarray");
Use_FillArray=TRUE;
break;
}
if(str_cmp(Keyword,"findfirst$")==0)
{
strcpy(Stk[Tmp],"findfirst$");
j=GetNumArgs(Tmp+2);
if(j==0)
{
strcpy(Stk[Ndx],", &FindData)");
}
Use_Findfirst=Use_Like=TRUE;
Use_BcxSplitPath=TRUE;
Use_Join=TRUE;
UseFlag=TRUE;
break;
}
if(str_cmp(Keyword,"findnext$")==0)
{
strcpy(Stk[Tmp],"findnext$");
if(str_cmp(Stk[Tmp+1],"(")==0 && str_cmp(Stk[Tmp+2],")")==0)
{
strcpy(Stk[Tmp+1],"(&FindData");
}
else if(Tmp==Ndx)
{
Ndx++;
strcpy(Stk[Ndx],"(&FindData)");
}
Use_Findnext=Use_Like=UseFlag=TRUE;
Use_Join=TRUE;
break;
}
if(str_cmp(Keyword,"fint")==0)
{
strcpy(Stk[Tmp],"FINT");
Use_Fint=TRUE;
break;
}
if(str_cmp(Keyword,"fix")==0)
{
strcpy(Stk[Tmp],"FIX");
Use_Fix=TRUE;
break;
}
if(str_cmp(Keyword,"filelocked")==0)
{
strcpy(Stk[Tmp],"FileLocked");
Use_FileLocked=TRUE;
break;
}
if(str_cmp(Keyword,"flush")==0)
{
strcpy(Stk[Tmp],"fflush");
break;
}
if(str_cmp(Keyword,"frac")==0)
{
strcpy(Stk[Tmp],"FRAC");
Use_Frac=TRUE;
break;
}
if(str_cmp(Keyword,"fracl")==0)
{
strcpy(Stk[Tmp],"FRACL");
Use_Fracl=TRUE;
break;
}
if(str_cmp(Keyword,"freefile")==0)
{
strcpy(Stk[Tmp],"FreeFile()");
Use_Freefile=TRUE;
}
break;
}
break;
}
if(a==7)
{
for(;;)
{
if(str_cmp(Keyword,"getprocaddress")==0)
{
static char GlobalName[2048];
memset(&GlobalName,0,sizeof(GlobalName));
static int s;
memset(&s,0,sizeof(s));
static int ss;
memset(&ss,0,sizeof(ss));
static char tempA[2048];
memset(&tempA,0,sizeof(tempA));
strcpy(GlobalName,Stk[Tmp-2]);
ss=HashNumber(GlobalName);
while(GlobalVarHash[ss])
{
s=GlobalVarHash[ss];
if(str_cmp(GlobalName,GlobalVars[s].VarName)==0)
{
strcpy(tempA,TypeDefs[GlobalVars[s].VarDef].VarName);
if(GlobalVars[s].VarPntr)
{
strcat(tempA," *");
}
}
ss=imod(ss+1,MaxGlobalVars);
}
if(tempA[0]==0)
{
static char LocalName[2048];
memset(&LocalName,0,sizeof(LocalName));
strcpy(LocalName,Stk[Tmp-2]);
if(LocalVarCnt)
{
{int i;
for(i=1; i<=LocalVarCnt; i+=1)
{
if(str_cmp(LocalName,LocalVars[i].VarName)==0)
{
strcpy(tempA,TypeDefs[LocalVars[i].VarDef].VarName);
if(LocalVars[i].VarPntr)
{
strcat(tempA," *");
}
break;
}
}
}
}
}
if(tempA[0]!=0)
{
strcpy(Stk[Tmp], join(3,"(",tempA,")dlsym"));
}
else
{
strcpy(Stk[Tmp],"dlsym");
}
break;
}
if(str_cmp(Keyword,"getattr")==0)
{
strcpy(Stk[Tmp],"GETATTR");
break;
}
if(str_cmp(Keyword,"getbvalue")==0)
{
strcpy(Stk[Tmp],"GetBValue");
break;
}
if(str_cmp(Keyword,"getc")==0)
{
strcpy(Stk[Tmp],"getc");
break;
}
if(str_cmp(Keyword,"getgvalue")==0)
{
strcpy(Stk[Tmp],"GetGValue");
break;
}
if(str_cmp(Keyword,"getrvalue")==0)
{
strcpy(Stk[Tmp],"GetRValue");
break;
}
if(str_cmp(Keyword,"getresource")==0)
{
strcpy(Stk[Tmp],"GetResource");
Use_Embed=TRUE;
}
break;
}
break;
}
if(a==8)
{
for(;;)
{
if(str_cmp(Keyword,"hiword")==0)
{
strcpy(Stk[Tmp],"HIWORD");
break;
}
if(str_cmp(Keyword,"hex$")==0)
{
strcpy(Stk[Tmp],"hex$");
Use_Hex=UseFlag=TRUE;
break;
}
if(str_cmp(Keyword,"hex2dec")==0)
{
strcpy(Stk[Tmp],"Hex2Dec");
Use_Hex2Dec=UseLCaseTbl=TRUE;
break;
}
if(str_cmp(Keyword,"hibyte")==0)
{
strcpy(Stk[Tmp],"HIBYTE");
break;
}
if(str_cmp(Keyword,"hide")==0)
{
strcpy(Stk[Tmp],"Hide");
break;
}
if(str_cmp(Keyword,"hypot")==0)
{
strcpy(Stk[Tmp],"hypot");
}
break;
}
break;
}
if(a==9)
{
for(;;)
{
if(str_cmp(Keyword,"inherits")==0)
{
strcpy(Stk[Tmp],"inherits");
break;
}
if(str_cmp(Keyword,"instr")==0)
{
strcpy(Stk[Tmp],"instr_b");
Use_Instr=Use_StrStr=TRUE;
Use_Stristr=UseLCaseTbl=TRUE;
break;
}
if(str_cmp(Keyword,"inchr")==0)
{
strcpy(Stk[Tmp],"inchr");
Use_Inchr=TRUE;
break;
}
if(str_cmp(Keyword,"imod")==0)
{
strcpy(Stk[Tmp],"imod");
Use_Imod=TRUE;
break;
}
if(str_cmp(Keyword,"iif")==0)
{
strcpy(Stk[Tmp],"iif");
Use_Iif=TRUE;
for(i=Tmp+1; i<=Ndx; i+=1)
{
if(str_cmp(Stk[i],"=")==0)
{
if(str_cmp(Stk[i-1],"<")!=0 && str_cmp(Stk[i-1],">")!=0)
{
strcpy(Stk[i],"==");
}
}
}
break;
}
if(str_cmp(Keyword,"iif$")==0)
{
strcpy(Stk[Tmp],"sziif$");
Use_sziif=TRUE;
for(i=Tmp+1; i<=Ndx; i+=1)
{
if(str_cmp(Stk[i],"=")==0)
{
if(str_cmp(Stk[i-1],"<")!=0 && str_cmp(Stk[i-1],">")!=0)
{
strcpy(Stk[i],"==");
}
}
}
break;
}
if(str_cmp(Keyword,"inkey")==0)
{
Use_InkeyD=TRUE;
Use_GetCh=TRUE;
UseFlag=TRUE;
strcpy(Stk[Tmp],"inkeyd()");
if(str_cmp(Stk[Tmp+1],"(")==0 && str_cmp(Stk[Tmp+2],")")==0)
{
*Stk[Tmp+1]=0;
*Stk[Tmp+2]=0;
}
break;
}
if(str_cmp(Keyword,"inkey$")==0)
{
Use_Inkey=TRUE;
Use_GetCh=TRUE;
UseFlag=TRUE;
strcpy(Stk[Tmp],"inkey$()");
if(str_cmp(Stk[Tmp+1],"(")==0 && str_cmp(Stk[Tmp+2],")")==0)
{
*Stk[Tmp+1]=0;
*Stk[Tmp+2]=0;
}
break;
}
if(str_cmp(Keyword,"ins$")==0)
{
strcpy(Stk[Tmp],"ins$");
Use_Ins=UseFlag=TRUE;
break;
}
if(str_cmp(Keyword,"instat")==0)
{
Use_Instat=TRUE;
strcpy(Stk[Tmp],"kbhit()");
break;
}
if(str_cmp(Keyword,"instrrev")==0)
{
strcpy(Stk[Tmp],"InstrRev");
Use_Instrrev=TRUE;
break;
}
if(str_cmp(Keyword,"isptr")==0)
{
strcpy(Stk[Tmp],"IsPtr");
Use_Isptr=TRUE;
break;
}
if(str_cmp(Keyword,"ireplace$")==0)
{
strcpy(Stk[Tmp],"iReplace$");
Use_iReplace=Use_Stristr=UseFlag=TRUE;
UseLCaseTbl=TRUE;
break;
}
if(str_cmp(Keyword,"iremove$")==0)
{
strcpy(Stk[Tmp],"IRemoveStr$");
Use_IRemove=UseFlag=TRUE;
Use_Stristr=UseLCaseTbl=TRUE;
break;
}
if(str_cmp(Keyword,"iterate")==0)
{
strcpy(Stk[Tmp],"continue");
}
break;
}
break;
}
if(a==10)
{
for(;;)
{
if(str_cmp(Keyword,"join$")==0)
{
strcpy(Stk[Tmp],"$$join$");
Use_Join=UseFlag=TRUE;
}
break;
}
break;
}
if(a==11)
{
for(;;)
{
if(str_cmp(Keyword,"keypress")==0)
{
strcpy(Stk[Tmp],"keypress()");
if(str_cmp(Stk[Tmp+1],"(")==0 && str_cmp(Stk[Tmp+2],")")==0)
{
*Stk[Tmp+1]=0;
*Stk[Tmp+2]=0;
}
Use_Keypress=TRUE;
Use_GetCh=TRUE;
}
break;
}
break;
}
if(a==12)
{
for(;;)
{
if(str_cmp(Keyword,"loadfile$")==0)
{
strcpy(Stk[Tmp],"$$LoadFile$");
Use_LoadFile=Use_Get=UseFlag=TRUE;
Use_Exist=Use_Lof=TRUE;
break;
}
if(str_cmp(Keyword,"lf$")==0)
{
strcpy(Stk[Tmp],"LF$");
Use_LF=UseFlag=TRUE;
break;
}
if(str_cmp(Keyword,"line")==0)
{
if(iMatchWrd(Stk[Tmp+1],"input"))
{
Use_Lineinput=TRUE;
strcpy(Stk[Tmp],"lineinput");
j=Tmp+4;
*Stk[Tmp+1]=0;
for(i=Tmp+2; i<=Ndx; i+=1)
{
if(*Stk[i]==44)
{
j=i+1;
break;
}
strcpy(Stk[Tmp+1], join(2,Stk[Tmp+1],Stk[i]));
*Stk[i]=0;
}
for(i=j; i<=Ndx; i+=1)
{
strcpy(Stk[Tmp+2], join(2,Stk[Tmp+2],Stk[i]));
}
}
break;
}
if(str_cmp(Keyword,"lcase$")==0)
{
strcpy(Stk[Tmp],"$$lcase$");
Use_Lcase=TRUE;
Use_StrUpLow=UseFlag=TRUE;
break;
}
if(str_cmp(Keyword,"ldouble")==0)
{
strcpy(Stk[Tmp],"LDOUBLE");
Use_Ldouble=UseFlag=TRUE;
break;
}
if(str_cmp(Keyword,"left$")==0)
{
strcpy(Stk[Tmp],"$$left$");
Use_Left=TRUE;
UseFlag=TRUE;
break;
}
if(str_cmp(Keyword,"long")==0)
{
strcpy(Stk[Tmp],"long");
break;
}
if(str_cmp(Keyword,"longlong")==0)
{
strcpy(Stk[Tmp],"LONGLONG");
break;
}
if(str_cmp(Keyword,"lpbyte")==0)
{
strcpy(Stk[Tmp],"LPBYTE");
break;
}
if(str_cmp(Keyword,"len")==0)
{
strcpy(Stk[Tmp],"strlen");
break;
}
if(str_cmp(Keyword,"lprint")==0)
{
strcpy(Stk[Tmp],"lprint");
if(Tmp==Ndx)
{
Ndx++;
strcpy(Stk[Ndx],enc(""));
}
break;
}
if(str_cmp(Keyword,"lpad$")==0)
{
strcpy(Stk[Tmp],"$$lpad$");
Use_Lpad=UseFlag=TRUE;
break;
}
if(str_cmp(Keyword,"ltrim$")==0)
{
strcpy(Stk[Tmp],"$$ltrim$");
Use_Ltrim=UseFlag=TRUE;
break;
}
if(str_cmp(Keyword,"lof")==0)
{
strcpy(Stk[Tmp],"lof");
if(DataType(Stk[Tmp+2])==vt_NUMBER)
{
strcpy(Stk[Tmp+2], join(2,"FP",Stk[Tmp+2]));
}
Use_Lof=TRUE;
break;
}
if(str_cmp(Keyword,"loadlibrary")==0 || str_cmp(Keyword,"load_dll")==0)
{
strcpy(Stk[Tmp],"LoadLibrary");
break;
}
if(str_cmp(Keyword,"like")==0)
{
strcpy(Stk[Tmp],"like");
Use_Like=TRUE;
break;
}
if(str_cmp(Keyword,"lobyte")==0)
{
strcpy(Stk[Tmp],"LOBYTE");
break;
}
if(str_cmp(Keyword,"loc")==0)
{
if(DataType(Stk[Tmp+2])==vt_NUMBER)
{
strcpy(Stk[Tmp+2], join(2,"FP",Stk[Tmp+2]));
}
strcpy(Stk[Tmp], join(5,"loc(",Stk[Tmp+2],",",Stk[Tmp+2],"len)"));
*Stk[Tmp+1]=0;
*Stk[Tmp+2]=0;
*Stk[Tmp+3]=0;
Use_Loc=TRUE;
break;
}
if(str_cmp(Keyword,"locate")==0)
{
Use_Locate=TRUE;
break;
}
if(str_cmp(Keyword,"log")==0)
{
strcpy(Stk[Tmp],"log");
break;
}
if(str_cmp(Keyword,"logl")==0)
{
strcpy(Stk[Tmp],"logl");
break;
}
if(str_cmp(Keyword,"log10")==0)
{
strcpy(Stk[Tmp],"log10");
break;
}
if(str_cmp(Keyword,"log10l")==0)
{
strcpy(Stk[Tmp],"log10l");
break;
}
if(str_cmp(Keyword,"loword")==0)
{
strcpy(Stk[Tmp],"LOWORD");
break;
}
if(str_cmp(Keyword,"lpstr")==0)
{
strcpy(Stk[Tmp],"PCHAR");
}
break;
}
break;
}
if(a==13)
{
for(;;)
{
if(str_cmp(Keyword,"mkd$")==0)
{
if(Tmp>2)
{
if(inchr(Stk[Tmp-2],"$")&&*Stk[Tmp-1]==61)
{
strcpy(Stk[1], join(2,"memcpy(",Stk[1]));
strcpy(Stk[Tmp-1],",");
strcpy(Stk[++Ndx],",9)");
}
}
strcpy(Stk[Tmp],"MKD");
Use_Mkd=UseFlag=TRUE;
break;
}
if(str_cmp(Keyword,"mki$")==0)
{
if(Tmp>2)
{
if(inchr(Stk[Tmp-2],"$")&&*Stk[Tmp-1]==61)
{
strcpy(Stk[1], join(2,"memcpy(",Stk[1]));
strcpy(Stk[Tmp-1],",");
strcpy(Stk[++Ndx],",3)");
}
}
strcpy(Stk[Tmp],"MKI");
Use_Mki=UseFlag=TRUE;
break;
}
if(str_cmp(Keyword,"mkl$")==0)
{
if(Tmp>2)
{
if(inchr(Stk[Tmp-2],"$")&&*Stk[Tmp-1]==61)
{
strcpy(Stk[1], join(2,"memcpy(",Stk[1]));
strcpy(Stk[Tmp-1],",");
strcpy(Stk[++Ndx],",5)");
}
}
strcpy(Stk[Tmp],"MKL");
Use_Mkl=UseFlag=TRUE;
break;
}
if(str_cmp(Keyword,"mkld$")==0)
{
if(Tmp>2)
{
if(inchr(Stk[Tmp-2],"$")&&*Stk[Tmp-1]==61)
{
strcpy(Stk[1], join(2,"memcpy(",Stk[1]));
strcpy(Stk[Tmp-1],",");
strcpy(Stk[++Ndx],",11)");
}
}
strcpy(Stk[Tmp],"MKLD");
Use_Mkld=UseFlag=TRUE;
break;
}
if(str_cmp(Keyword,"mks$")==0)
{
if(Tmp>2)
{
if(inchr(Stk[Tmp-2],"$")&&*Stk[Tmp-1]==61)
{
strcpy(Stk[1], join(2,"memcpy(",Stk[1]));
strcpy(Stk[Tmp-1],",");
strcpy(Stk[++Ndx],",5)");
}
}
strcpy(Stk[Tmp],"MKS");
Use_Mks=UseFlag=TRUE;
break;
}
if(str_cmp(Keyword,"mid$")==0)
{
if(Tmp>1)
{
strcpy(Stk[Tmp],"$$mid$");
Use_Mid=UseFlag=TRUE;
}
else
{
strcpy(Stk[Tmp],"midstr");
Use_Midstr=UseFlag=TRUE;
}
break;
}
if(str_cmp(Keyword,"min")==0)
{
strcpy(Stk[Tmp],"_MIN_");
Use_Min=TRUE;
break;
}
if(str_cmp(Keyword,"main")==0)
{
strcpy(Stk[Tmp],"main");
break;
}
if(str_cmp(Keyword,"makeintresource")==0)
{
strcpy(Stk[Tmp],"MAKEINTRESOURCE");
break;
}
if(str_cmp(Keyword,"makelong")==0)
{
strcpy(Stk[Tmp],"MAKELONG");
break;
}
if(str_cmp(Keyword,"makeword")==0)
{
strcpy(Stk[Tmp],"MAKEWORD");
break;
}
if(str_cmp(Keyword,"max")==0)
{
strcpy(Stk[Tmp],"_MAX_");
Use_Max=TRUE;
break;
}
if(str_cmp(Keyword,"mcase$")==0)
{
strcpy(Stk[Tmp],"$$mcase$");
Use_Mcase=UseFlag=TRUE;
Use_StrUpLow=TRUE;
break;
}
if(str_cmp(Keyword,"mkdir")==0)
{
strcpy(Stk[Tmp],"mkdir");
break;
}
if(str_cmp(Keyword,"mod")==0)
{
strcpy(Stk[Tmp],"fmod");
}
break;
}
break;
}
if(a==14)
{
for(;;)
{
if(str_cmp(Keyword,"new")==0)
{
if(iMatchWrd(Stk[Tmp-1],"binary"))
{
break;
}
if(UseCpp==FALSE)
{
Abort("'NEW' can only be used with C++");
}
strcpy(Stk[Tmp],"new ");
break;
}
if(str_cmp(Keyword,"nul$")==0)
{
strcpy(Stk[Tmp],"NUL$");
Use_NUL=UseFlag=TRUE;
break;
}
if(str_cmp(Keyword,"null")==0)
{
strcpy(Stk[Tmp],"NULL");
break;
}
if(str_cmp(Keyword,"now$")==0)
{
strcpy(Stk[Tmp],"now$()");
Use_Now=UseFlag=TRUE;
}
break;
}
break;
}
if(a==15)
{
for(;;)
{
if(str_cmp(Keyword,"open")==0)
{
for(A=Tmp+1; A<=Ndx; A+=1)
{
if(str_cmp(left(Stk[A],1),"#")==0)
{
strcpy(Stk[A],mid(Stk[A],2));
break;
}
}
break;
}
if(str_cmp(Keyword,"oct$")==0)
{
strcpy(Stk[Tmp],"oct$");
Use_Oct=UseFlag=TRUE;
break;
}
if(str_cmp(Keyword,"osversion")==0)
{
strcpy(Stk[Tmp],"OSVersion()");
if(str_cmp(Stk[Tmp+1],"(")==0 && str_cmp(Stk[Tmp+2],")")==0)
{
*Stk[Tmp+1]=0;
*Stk[Tmp+2]=0;
}
Use_OSVersion=TRUE;
}
break;
}
break;
}
if(a==16)
{
for(;;)
{
if(str_cmp(Keyword,"pause")==0)
{
strcpy(Stk[Tmp],"Pause()");
if(str_cmp(Stk[Tmp+1],"(")==0 && str_cmp(Stk[Tmp+2],")")==0)
{
*Stk[Tmp+1]=0;
*Stk[Tmp+2]=0;
}
Use_Pause=Use_Keypress=TRUE;
Use_GetCh=TRUE;
break;
}
if(str_cmp(Keyword,"preserve")==0)
{
strcpy(Stk[Tmp],"PRESERVE");
break;
}
if(str_cmp(Keyword,"print#")==0)
{
strcpy(Stk[Tmp],"fprint");
break;
}
if(str_cmp(Keyword,"print")==0)
{
if(str_cmp(left(Stk[Tmp+1],1),"#")==0)
{
strcpy(Stk[Tmp],"fprint");
strcpy(Stk[Tmp+1],mid(Stk[Tmp+1],2));
}
break;
}
if(str_cmp(Keyword,"ptr")==0)
{
CompPtr=1;
strcpy(Stk[Tmp-1], join(2,Stk[Tmp-1],"*"));
*Stk[Tmp]=0;
if(Tmp==Ndx)
{
Ndx--;
while(tally(Stk[Ndx],"*")==strlen(Stk[Ndx]))
{
strcpy(Stk[Ndx-1], join(2,Stk[Ndx-1],Stk[Ndx]));
*Stk[Ndx]=0;
Ndx--;
}
}
else
{
i=Tmp-1;
while(tally(Stk[i],"*")==strlen(Stk[i]))
{
strcpy(Stk[i-1], join(2,Stk[i-1],Stk[i]));
*Stk[i]=0;
i--;
}
}
break;
}
if(str_cmp(Keyword,"peek$")==0)
{
strcpy(Stk[Tmp],"$$peekstr$");
Use_PeekStr=UseFlag=TRUE;
break;
}
if(str_cmp(Keyword,"poke")==0)
{
strcpy(Stk[Tmp],"memmove");
break;
}
if(str_cmp(Keyword,"pow")==0)
{
strcpy(Stk[Tmp],"pow");
break;
}
if(str_cmp(Keyword,"powl")==0)
{
strcpy(Stk[Tmp],"powl");
break;
}
if(str_cmp(Keyword,"private")==0)
{
if(UseCpp)
{
strcpy(Stk[Tmp],"private");
}
if(iMatchWrd(Stk[Tmp+1],"const"))
{
strcpy(Stk[Tmp],"enum ");
strcpy(Stk[Tmp+1], join(2,Stk[Tmp+2],"{"));
Ndx++;
strcpy(Stk[Ndx],"}");
}
break;
}
if(str_cmp(Keyword,"public")==0)
{
if(UseCpp)
{
strcpy(Stk[Tmp],"public");
}
}
break;
}
break;
}
if(a==17)
{
for(;;)
{
if(str_cmp(Keyword,"qbcolor")==0)
{
strcpy(Stk[Tmp],"qbcolor");
Use_QBColor=TRUE;
}
break;
}
break;
}
if(a==18)
{
for(;;)
{
if(str_cmp(Keyword,"regmatch")==0)
{
strcpy(Stk[Tmp],"regmatch");
Use_PeekStr=Use_RegEx=TRUE;
break;
}
if(str_cmp(Keyword,"rewind")==0)
{
strcpy(Stk[Tmp],"rewind");
if(DataType(Stk[Tmp+2])==vt_NUMBER)
{
strcpy(Stk[Tmp+2], join(2,"FP",Stk[Tmp+2]));
}
break;
}
if(str_cmp(Keyword,"remove$")==0)
{
strcpy(Stk[Tmp],"$$RemoveStr$");
Use_Remove=Use_StrStr=UseFlag=TRUE;
break;
}
if(str_cmp(Keyword,"replace$")==0)
{
strcpy(Stk[Tmp],"$$replace$");
Use_Replace=Use_StrStr=UseFlag=TRUE;
break;
}
if(str_cmp(Keyword,"right$")==0)
{
strcpy(Stk[Tmp],"$$right$");
Use_Right=UseFlag=TRUE;
break;
}
if(str_cmp(Keyword,"rename")==0)
{
strcpy(Stk[Tmp],"rename");
break;
}
if(str_cmp(Keyword,"register")==0)
{
strcpy(Stk[Tmp],"register");
break;
}
if(str_cmp(Keyword,"randomize")==0)
{
strcpy(Stk[Tmp],"randomize");
Use_Randomize=TRUE;
Use_Rnd=TRUE;
if(Ndx==1)
{
Use_Timer=TRUE;
strcpy(Stk[1],"randomize(timer())");
}
break;
}
if(str_cmp(Keyword,"rec")==0)
{
if(DataType(Stk[Tmp+2])==vt_NUMBER)
{
strcpy(Stk[Tmp+2], join(2,"FP",Stk[Tmp+2]));
}
strcpy(Stk[Tmp], join(5,"rec(",Stk[Tmp+2],",",Stk[Tmp+2],"len)"));
*Stk[Tmp+1]=0;
*Stk[Tmp+2]=0;
*Stk[Tmp+3]=0;
Use_Rec=TRUE;
break;
}
if(str_cmp(Keyword,"reccount")==0)
{
char length[2048];
if(DataType(Stk[Tmp+2])==vt_NUMBER)
{
strcpy(Stk[Tmp+2], join(2,"FP",Stk[Tmp+2]));
}
strcpy(Stk[Tmp],"reccount");
strcpy(length, join(2,Stk[Tmp+2],"len)"));
for(i=Tmp+1; i<=Ndx; i+=1)
{
if(*Stk[i]==41)
{
*Stk[i]=0;
break;
}
strcpy(Stk[Tmp], join(2,Stk[Tmp],Stk[i]));
*Stk[i]=0;
}
strcpy(Stk[Tmp], join(3,Stk[Tmp],",",length));
Use_RecCount=TRUE;
break;
}
if(str_cmp(Keyword,"reclen")==0)
{
strcpy(Stk[Tmp],"reclen");
break;
}
if(str_cmp(Keyword,"record")==0)
{
strcpy(Stk[Tmp],"record");
break;
}
if(str_cmp(Keyword,"remain$")==0)
{
strcpy(Stk[Tmp],"$$remain$");
Use_Remain=UseFlag=TRUE;
break;
}
if(str_cmp(Keyword,"retain$")==0)
{
strcpy(Stk[Tmp],"$$Retain$");
Use_Retain=UseFlag=TRUE;
break;
}
if(str_cmp(Keyword,"repeat$")==0)
{
strcpy(Stk[Tmp],"$$repeat$");
Use_Repeat=UseFlag=TRUE;
break;
}
if(str_cmp(Keyword,"reverse$")==0)
{
strcpy(Stk[Tmp],"$$reverse$");
Use_Reverse=UseFlag=TRUE;
break;
}
if(str_cmp(Keyword,"rgb")==0)
{
strcpy(Stk[Tmp],"RGB");
break;
}
if(str_cmp(Keyword,"rmdir")==0)
{
strcpy(Stk[Tmp],"rmdir");
break;
}
if(str_cmp(Keyword,"rnd")==0)
{
strcpy(Stk[Tmp],"rnd()");
if(str_cmp(Stk[Tmp+1],"(")==0 && str_cmp(Stk[Tmp+2],")")==0)
{
*Stk[Tmp+1]=0;
*Stk[Tmp+2]=0;
}
Use_Rnd=TRUE;
break;
}
if(str_cmp(Keyword,"round")==0)
{
strcpy(Stk[Tmp],"Round");
Use_Round=TRUE;
break;
}
if(str_cmp(Keyword,"rpad$")==0)
{
strcpy(Stk[Tmp],"$$rpad$");
Use_Rpad=UseFlag=TRUE;
break;
}
if(str_cmp(Keyword,"rtrim$")==0)
{
strcpy(Stk[Tmp],"$$rtrim$");
Use_Rtrim=UseFlag=TRUE;
break;
}
if(str_cmp(Keyword,"run")==0)
{
strcpy(Stk[Tmp],"Run");
Use_Run=TRUE;
}
break;
}
break;
}
if(a==19)
{
for(;;)
{
if(str_cmp(Keyword,"scanerror")==0)
{
strcpy(Stk[Tmp],"ScanError");
break;
}
if(str_cmp(Keyword,"sprint")==0)
{
strcpy(Stk[Tmp],"sprint");
break;
}
if(str_cmp(Keyword,"spc$")==0)
{
strcpy(Stk[Tmp],"SPC$");
Use_SPC=UseFlag=TRUE;
break;
}
if(str_cmp(Keyword,"str$")==0)
{
strcpy(Stk[Tmp],"$$str$");
Use_Str=UseFlag=TRUE;
break;
}
if(str_cmp(Keyword,"strl$")==0)
{
strcpy(Stk[Tmp],"$$strl$");
Use_Strl=UseFlag=TRUE;
break;
}
if(str_cmp(Keyword,"searchpath$")==0)
{
strcpy(Stk[Tmp],"$$SEARCHPATH$");
Use_SearchPath=UseFlag=TRUE;
break;
}
if(str_cmp(Keyword,"sizeof")==0)
{
strcpy(Stk[Tmp],"sizeof");
break;
}
if(str_cmp(Keyword,"setattr")==0)
{
strcpy(Stk[Tmp],"SETATTR");
break;
}
if(str_cmp(Keyword,"setwindowrtftext")==0)
{
strcpy(Stk[Tmp],"SetWindowRTFText");
break;
}
if(str_cmp(Keyword,"sgn")==0)
{
strcpy(Stk[Tmp],"sgn");
Use_Sgn=TRUE;
break;
}
if(str_cmp(Keyword,"short")==0)
{
strcpy(Stk[Tmp],"short");
break;
}
if(str_cmp(Keyword,"shell")==0)
{
Use_Shell=TRUE;
break;
}
if(str_cmp(Keyword,"show")==0)
{
strcpy(Stk[Tmp],"Show");
break;
}
if(str_cmp(Keyword,"sin")==0)
{
strcpy(Stk[Tmp],"sin");
break;
}
if(str_cmp(Keyword,"sinl")==0)
{
strcpy(Stk[Tmp],"sinl");
break;
}
if(str_cmp(Keyword,"single")==0)
{
strcpy(Stk[Tmp],"float");
break;
}
if(str_cmp(Keyword,"sinh")==0)
{
strcpy(Stk[Tmp],"sinh");
break;
}
if(str_cmp(Keyword,"sleep")==0)
{
strcpy(Stk[Tmp],"sleep");
break;
}
if(str_cmp(Keyword,"space$")==0)
{
strcpy(Stk[Tmp],"$$space$");
Use_Space=UseFlag=TRUE;
break;
}
if(str_cmp(Keyword,"split")==0)
{
strcpy(Stk[Tmp],"Split");
Use_Split=UseFlag=TRUE;
Use_Remove=TRUE;
Use_StrStr=TRUE;
Use_Mid=TRUE;
Use_Left=TRUE;
Use_Instr=TRUE;
Use_Stristr=TRUE;
UseLCaseTbl=TRUE;
break;
}
if(str_cmp(Keyword,"splitbarfg")==0)
{
strcpy(Stk[Tmp],"SplitBarFG");
break;
}
if(str_cmp(Keyword,"splitbarbg")==0)
{
strcpy(Stk[Tmp],"SplitBarBG");
break;
}
if(str_cmp(Keyword,"sqr")==0 || str_cmp(Keyword,"sqrt")==0)
{
strcpy(Stk[Tmp],"sqrt");
break;
}
if(str_cmp(Keyword,"sqrl")==0 || str_cmp(Keyword,"sqrtl")==0)
{
strcpy(Stk[Tmp],"sqrtl");
break;
}
if(str_cmp(Keyword,"strarray")==0)
{
strcpy(Stk[Tmp],"PCHAR*");
break;
}
if(str_cmp(Keyword,"strim$")==0)
{
strcpy(Stk[Tmp],"$$strim$");
Use_Strim=UseFlag=TRUE;
break;
}
if(str_cmp(Keyword,"string")==0)
{
strcpy(Stk[Tmp],"string");
break;
}
if(str_cmp(Keyword,"string$")==0)
{
strcpy(Stk[Tmp],"$$stringx$");
Use_String=UseFlag=TRUE;
break;
}
if(str_cmp(Keyword,"strptr")==0)
{
strcpy(Stk[Tmp],"STRPTR");
Use_Strptr=TRUE;
break;
}
if(str_cmp(Keyword,"strtoken$")==0)
{
strcpy(Stk[Tmp],"StrToken$");
Use_Strtoken=Use_Mid=Use_Left=Use_Extract=TRUE;
Use_Instr=Use_Instrrev=Use_Stristr=Use_Tally=Use_Remove=TRUE;
Use_StrStr=UseLCaseTbl=UseFlag=TRUE;
break;
}
if(str_cmp(Keyword,"swap")==0)
{
strcpy(Stk[Tmp],"swap");
Use_Swap=TRUE;
break;
}
if(str_cmp(Keyword,"sysdir$")==0)
{
strcpy(Stk[Tmp],"$$sysdir$()");
if(str_cmp(Stk[Tmp+1],"(")==0 && str_cmp(Stk[Tmp+2],")")==0)
{
*Stk[Tmp+1]=0;
*Stk[Tmp+2]=0;
}
Use_Sysdir=UseFlag=TRUE;
break;
}
if(str_cmp(Keyword,"sysstr")==0)
{
strcpy(Stk[Tmp],"SysStr");
Use_SysStr=TRUE;
}
break;
}
break;
}
if(a==20)
{
for(;;)
{
if(str_cmp(Keyword,"tab$")==0)
{
strcpy(Stk[Tmp],"TAB$");
Use_TAB=UseFlag=TRUE;
break;
}
if(str_cmp(Keyword,"true")==0)
{
strcpy(Stk[Tmp],"TRUE");
break;
}
if(str_cmp(Keyword,"trim$")==0)
{
strcpy(Stk[Tmp],"$$trim$");
Use_Trim=UseFlag=TRUE;
break;
}
if(str_cmp(Keyword,"tally")==0)
{
strcpy(Stk[Tmp],"tally");
Use_Tally=UseLCaseTbl=Use_Stristr=Use_StrStr=TRUE;
break;
}
if(str_cmp(Keyword,"tan")==0)
{
strcpy(Stk[Tmp],"tan");
break;
}
if(str_cmp(Keyword,"tanh")==0)
{
strcpy(Stk[Tmp],"tanh");
break;
}
if(str_cmp(Keyword,"tanl")==0)
{
strcpy(Stk[Tmp],"tanl");
break;
}
if(str_cmp(Keyword,"tempdir$")==0)
{
strcpy(Stk[Tmp],"$$tempdir$()");
if(str_cmp(Stk[Tmp+1],"(")==0 && str_cmp(Stk[Tmp+2],")")==0)
{
*Stk[Tmp+1]=0;
*Stk[Tmp+2]=0;
}
Use_Tempdir=UseFlag=Use_Exist=TRUE;
break;
}
if(str_cmp(Keyword,"tempfilename$")==0)
{
strcpy(Stk[Tmp],"$$TempFileName$");
Use_TempFileName=UseFlag=TRUE;
Use_Exist=Use_Rnd=TRUE;
break;
}
if(str_cmp(Keyword,"this")==0)
{
strcpy(Stk[Tmp],"this");
if(*Stk[Tmp+1]==46)
{
strcpy(Stk[Tmp+1], join(2,"->",mid(Stk[Tmp+1],2)));
}
break;
}
if(str_cmp(Keyword,"time$")==0)
{
if(str_cmp(Stk[Tmp+1],"(")!=0)
{
strcpy(Stk[Tmp],"$$timef$()");
}
else
{
strcpy(Stk[Tmp],"$$timef$");
}
if(str_cmp(Stk[Tmp+1],"(")==0 && str_cmp(Stk[Tmp+2],")")==0)
{
*Stk[Tmp+1]=0;
*Stk[Tmp+2]=0;
}
Use_Time=UseFlag=TRUE;
break;
}
if(str_cmp(Keyword,"timer")==0)
{
strcpy(Stk[Tmp],"timer()");
if(str_cmp(Stk[Tmp+1],"(")==0 && str_cmp(Stk[Tmp+2],")")==0)
{
*Stk[Tmp+1]=0;
*Stk[Tmp+2]=0;
}
Use_Timer=TRUE;
}
break;
}
break;
}
if(a==21)
{
for(;;)
{
if(str_cmp(Keyword,"uint")==0)
{
strcpy(Stk[Tmp],"UINT");
break;
}
if(str_cmp(Keyword,"ushort")==0)
{
strcpy(Stk[Tmp],"USHORT");
break;
}
if(str_cmp(Keyword,"ulong")==0)
{
strcpy(Stk[Tmp],"ULONG");
break;
}
if(str_cmp(Keyword,"ulonglong")==0)
{
strcpy(Stk[Tmp],"ULONGLONG");
break;
}
if(str_cmp(Keyword,"ucase$")==0)
{
strcpy(Stk[Tmp],"$$ucase$");
Use_Ucase=UseFlag=TRUE;
Use_StrUpLow=TRUE;
break;
}
if(str_cmp(Keyword,"ubound")==0)
{
strcpy(Stk[Tmp],"ubound");
Use_Ubound=TRUE;
break;
}
if(str_cmp(Keyword,"using$")==0)
{
strcpy(Stk[Tmp],"$$Using$");
Use_Using=UseFlag=TRUE;
break;
}
if(str_cmp(Keyword,"using")==0)
{
strcpy(Stk[Tmp],"using");
}
break;
}
break;
}
if(a==22)
{
for(;;)
{
if(str_cmp(Keyword,"val")==0)
{
strcpy(Stk[Tmp],"VAL");
Use_Val=TRUE;
break;
}
if(str_cmp(Keyword,"vall")==0)
{
strcpy(Stk[Tmp],"VALL");
Use_Vall=TRUE;
break;
}
if(str_cmp(Keyword,"variant")==0)
{
strcpy(Stk[Tmp],"VARIANT");
break;
}
if(str_cmp(Keyword,"varptr")==0)
{
*Stk[Tmp]=0;
break;
}
if(str_cmp(Keyword,"vchr$")==0)
{
strcpy(Stk[Tmp],"$$vchr$");
Use_VChr=UseFlag=TRUE;
break;
}
if(str_cmp(Keyword,"virtual")==0)
{
strcpy(Stk[Tmp],"virtual");
Use_Virtual=TRUE;
break;
}
if(str_cmp(Keyword,"vt$")==0)
{
strcpy(Stk[Tmp],"VT$");
Use_VT=UseFlag=TRUE;
break;
}
if(str_cmp(Keyword,"verify")==0)
{
strcpy(Stk[Tmp],"Verify");
Use_Verify=Use_Mid=UseFlag=TRUE;
}
break;
}
break;
}
if(a==23)
{
for(;;)
{
if(str_cmp(Keyword,"widetoansi$")==0)
{
strcpy(Stk[Tmp],"$$WideToAnsi$");
Use_WideToAnsi=UseFlag=TRUE;
}
break;
}
}
break;
}
}
if(CompPtr==1)
{
RemEmptyTokens();
}
if(WithCnt)
{
for(i=1; i<=Ndx; i+=1)
{
if(str_cmp(left(Stk[i],2),"->")==0 || ( str_cmp(left(Stk[i],1),".")==0 && !IsNumber(mid(Stk[i],2,1))))
{
if(str_cmp(WithVar[WithCnt],"this")==0)
{
strcpy(Stk[i], join(2,"->",mid(Stk[i],2)));
}
if(i==1)
{
strcpy(Stk[i], join(2,WithVar[WithCnt],Stk[i]));
}
else
{
if(!IsReservedWord(Stk[i-1]))
{
if(!(isalpha(Stk[i-1][strlen(Stk[i-1]-1)])||IsNumber(right(Stk[i-1],strlen(Stk[i-1]-1)))))
{
strcpy(Stk[i], join(2,WithVar[WithCnt],Stk[i]));
}
}
else
{
strcpy(Stk[i], join(2,WithVar[WithCnt],Stk[i]));
}
}
while((isalpha(*Stk[i+1])||*Stk[i+1]==46)&&(i<Ndx))
{
i++;
}
}
}
}
if(CompToken==1)
{
strcpy(Keyword,lcase(Stk[1]));
for(;;)
{
if(str_cmp(Keyword,"dim")==0)
{
CompToken=0;
break;
}
if(str_cmp(Keyword,"local")==0)
{
CompToken=0;
break;
}
if(str_cmp(Keyword,"global")==0)
{
CompToken=0;
break;
}
if(str_cmp(Keyword,"static")==0)
{
CompToken=0;
break;
}
if(str_cmp(Keyword,"shared")==0)
{
CompToken=0;
break;
}
if(str_cmp(Keyword,"raw")==0)
{
CompToken=0;
break;
}
if(str_cmp(Keyword,"dynamic")==0)
{
CompToken=0;
break;
}
if(str_cmp(Keyword,"free")==0)
{
CompToken=0;
break;
}
if(str_cmp(Keyword,"redim")==0)
{
CompToken=0;
break;
}
if(str_cmp(Keyword,"sub")==0)
{
CompToken=0;
break;
}
if(str_cmp(Keyword,"function")==0)
{
CompToken=0;
break;
}
if(str_cmp(Keyword,"overloaded")==0)
{
CompToken=0;
break;
}
if(str_cmp(Keyword,"public")==0)
{
CompToken=0;
break;
}
if(str_cmp(Keyword,"declare")==0)
{
CompToken=0;
break;
}
if(str_cmp(Keyword,"c_declare")==0)
{
CompToken=0;
break;
}
if(str_cmp(Keyword,"auto")==0)
{
CompToken=0;
break;
}
if(str_cmp(Keyword,"register")==0)
{
CompToken=0;
break;
}
if(str_cmp(Keyword,"extern")==0)
{
CompToken=0;
break;
}
// case else
{
AsmUnknownStructs(1);
}
break;
}
}
}
void JoinStrings (int i, int inif)
{
int DoJoin=0;
int InBrace=0;
int OnlyPara=0;
int j=0;
int l=0;
int sj=i;
char t[2048];
int vt;
while(i<=Ndx)
{
strcpy(t,lcase(Stk[i]));
if(!j&&!OnlyPara&&!InBrace)
{
vt=DataType(t);
if(vt==vt_STRVAR||vt==vt_STRLIT)
{
sj=i;
i++;
continue;
}
}
for(;;)
{
if(str_cmp(t,"&")==0)
{
if(OnlyPara)
{
break;
}
vt=DataType(Stk[i+1]);
if(vt!=vt_STRVAR&&vt!=vt_STRLIT)
{
vt=DataType(Stk[i-1]);
}
if(vt==vt_STRVAR||vt==vt_STRLIT)
{
j++;
strcpy(Stk[i],",");
*t=0;
}
break;
}
if(str_cmp(t,"[")==0)
{
InBrace++;
break;
}
if(str_cmp(t,"]")==0)
{
InBrace--;
break;
}
if(str_cmp(t,"(")==0)
{
if(str_cmp(Stk[i+1],"*")!=0)
{
JoinStrings(i+1,inif);
l=i-1;
while(str_cmp(Stk[i],")")!=0)
{
strcpy(Stk[l], join(3,Stk[l],Stk[i]," "));
*Stk[i]=0;
i++;
}
strcat(Stk[l],Stk[i]);
*Stk[i]=0;
}
break;
}
if(str_cmp(t,")")==0)
{
if(j)
{
strcpy(Stk[sj], join(4,"join$(",str(j+1),",",Stk[sj]));
j=sj+1;
while(j<i)
{
strcat(Stk[sj],Stk[j]);
*Stk[j]=0;
j++;
}
strcat(Stk[sj],")");
}
return;
}
if(str_cmp(t,"||")==0)
{
strcpy(Stk[i]," or ");
DoJoin=TRUE;
break;
}
if(str_cmp(t,"&&")==0)
{
strcpy(Stk[i]," and ");
DoJoin=TRUE;
break;
}
if(str_cmp(t,"then")==0 || str_cmp(t,"for")==0)
{
DoJoin=TRUE;
break;
}
if(str_cmp(t,"=")==0)
{
if(!inif)
{
OnlyPara=TRUE;
}
else
{
DoJoin=TRUE;
}
break;
}
if(str_cmp(t,"if")==0 || str_cmp(t,"elseif")==0 || str_cmp(t,"while")==0)
{
inif=TRUE;
sj=i+1;
break;
}
if(str_cmp(t,"sprint")==0 || str_cmp(t,"lprint")==0 || str_cmp(t,"fprint")==0 || str_cmp(t,"fprintf")==0 || str_cmp(t,"print")==0 || str_cmp(t,"print#")==0)
{
OnlyPara=TRUE;
break;
}
// case else
{
if(str_cmp(left(Stk[i],2),"].")==0 || str_cmp(left(Stk[i],3),"]->")==0)
{
InBrace--;
}
}
break;
}
if((DoJoin||inchr(",+-*/^;:<>~|&",t))&&!OnlyPara&&!InBrace)
{
DoJoin=0;
if(j)
{
strcpy(Stk[sj], join(4,"join$(",str(j+1),",",Stk[sj]));
j=sj;
j++;
while(j<i)
{
strcat(Stk[sj],Stk[j]);
*Stk[j]=0;
j++;
}
strcat(Stk[sj],")");
}
j=0;
sj=i+1;
}
i++;
}
if(j)
{
strcpy(Stk[sj], join(4,"join$(",str(j+1),",",Stk[sj]));
j=sj;
j++;
while(j<=i)
{
strcat(Stk[sj],Stk[j]);
*Stk[j]=0;
j++;
}
strcat(Stk[sj],")");
}
}
void Transforms (void)
{
int nBrace;
int CntMarker;
int IFCond;
int a;
int i;
int j;
char Keyword[2048];
char lszTmp[2048];
*Keyword=0;
*lszTmp=0;
if(Ndx==3&&!WithCnt)
{
if(str_cmp(Stk[2],"+")==0 && str_cmp(Stk[3],"+")==0)
{
fprintf(Outfile,"%s%s%s\n",Scoot,Clean(Stk[1]),"++;");
Ndx=0;
Statements++;
return;
}
if(str_cmp(Stk[2],"-")==0 && str_cmp(Stk[3],"-")==0)
{
fprintf(Outfile,"%s%s%s\n",Scoot,Clean(Stk[1]),"--;");
Ndx=0;
Statements++;
return;
}
if(str_cmp(Stk[1],"+")==0 && str_cmp(Stk[2],"+")==0)
{
fprintf(Outfile,"%s%s%s%s\n",Scoot,"++",Clean(Stk[3]),";");
Ndx=0;
Statements++;
return;
}
if(str_cmp(Stk[1],"-")==0 && str_cmp(Stk[2],"-")==0)
{
fprintf(Outfile,"%s%s%s%s\n",Scoot,"--",Clean(Stk[3]),";");
Ndx=0;
Statements++;
return;
}
}
strcpy(Keyword,lcase(Stk[1]));
a=inchr("abcdefghijklmnopqrstuvwxyz$",Keyword);
for(;;)
{
if(a==3)
{
if(str_cmp(Keyword,"case")==0)
{
nBrace=0;
CntMarker=2;
j=0;
for(i=2; i<=Ndx; i+=1)
{
if(inchr("([",Stk[i]))
{
nBrace++;
}
if(inchr(")]",Stk[i]))
{
nBrace--;
}
if(str_cmp(Stk[i],",")==0)
{
if(nBrace==0)
{
CntMarker=i+1;
}
}
if(iMatchWrd(Stk[i],"to"))
{
j=1;
strcpy(Stk[i]," and <=");
strcpy(Stk[CntMarker], join(2,">=",Stk[CntMarker]));
}
}
if(j==1)
{
*Src=0;
for(i=1; i<=Ndx; i+=1)
{
strcpy(Src, join(3,Src,Stk[i]," "));
}
XParse(Src);
}
return;
}
break;
}
if(a==4)
{
if(str_cmp(Keyword,"declare")==0 && iMatchWrd(Stk[4],"lib"))
{
char alias[2048];
int i;
int idx=-1;
char AR_DllName[2048];
strcpy(Stk[5],RemoveStr(Stk[5],DQ));
for(i=0; i<=LoadLibsCnt-1; i+=1)
{
if(str_cmp(Stk[5],Loadlibs[i])==0)
{
idx=i;
break;
}
}
if(idx<0)
{
strcpy(Loadlibs[LoadLibsCnt],Stk[5]);
LoadLibsCnt++;
}
if(iMatchWrd(Stk[6],"alias"))
{
strcpy(alias,Stk[7]);
*Stk[6]=0;
*Stk[7]=0;
}
else
{
strcpy(alias,enc(Stk[3]));
}
DllCnt++;
if(DllCnt>799)
{
Abort("Maximum number of declarations exceded.");
}
if(inchr(Stk[5],"-"))
{
strcpy(AR_DllName,extract(Stk[5],"-"));
}
else if(inchr(Stk[5],"."))
{
strcpy(AR_DllName,extract(Stk[5],"."));
}
strcpy(DllDecl[DllCnt], join(11,"static BCXFPROT",ltrim(str(DllCnt)),SPC,Clean(Stk[3]),"=(BCXFPROT",ltrim(str(DllCnt)),")dlsym(H_",ucase(AR_DllName),", ",alias,");"));
*Stk[4]=0;
*Stk[5]=0;
return;
}
break;
}
if(a==7)
{
if(str_cmp(Keyword,"get$")==0)
{
strcpy(Stk[1],"~get");
return;
}
if(str_cmp(Keyword,"global")==0 && iMatchWrd(Stk[2],"dynamic"))
{
strcpy(Stk[1],"global");
return;
}
break;
}
if(a==9)
{
if(str_cmp(Keyword,"iremove")==0)
{
char Mat[2048];
char Fat[2048];
*Mat=0;
*Fat=0;
for(i=2; i<=Ndx; i+=1)
{
if(iMatchWrd(Stk[i],"from"))
{
*Stk[i]=0;
break;
}
}
for(j=2; j<=i; j+=1)
{
strcat(Mat,Stk[j]);
}
for(j=i; j<=Ndx; j+=1)
{
strcat(Fat,Stk[j]);
}
strcpy(lszTmp, join(5,"=iremove$(",Fat,",",Mat,")"));
FastLexer(Fat," ()","");
strcpy(lszTmp, join(2,Stk[Ndx],lszTmp));
XParse(lszTmp);
TokenSubstitutions();
Emit();
Ndx=0;
return;
}
if(str_cmp(Keyword,"ireplace")==0)
{
if(Ndx<6)
{
Abort("Problem with IREPLACE statement");
}
int W;
int I;
char VV[2048];
char RR[2048];
char WW[2048];
*VV=0;
*RR=0;
*WW=0;
for(W=2; W<=Ndx; W+=1)
{
if(iMatchWrd(Stk[W],"with"))
{
*Stk[W]=0;
break;
}
}
for(I=2; I<=Ndx; I+=1)
{
if(iMatchWrd(Stk[I],"in"))
{
*Stk[I]=0;
break;
}
}
i=I+1;
for(j=i; j<=Ndx; j+=1)
{
strcat(VV,Stk[j]);
}
for(j=2; j<=W; j+=1)
{
strcat(RR,Stk[j]);
}
i=W+1;
for(j=i; j<=I; j+=1)
{
strcat(WW,Stk[j]);
}
strcpy(lszTmp, join(7,"=ireplace$(",VV,",",RR,",",WW,")"));
FastLexer(VV," ()","");
strcpy(lszTmp, join(2,Stk[Ndx],lszTmp));
XParse(lszTmp);
TokenSubstitutions();
Emit();
Ndx=0;
return;
}
break;
}
if(a==12)
{
if(str_cmp(Keyword,"local")==0 && iMatchWrd(Stk[2],"dynamic"))
{
strcpy(Stk[1],"dim");
return;
}
break;
}
if(a==16)
{
if(str_cmp(Keyword,"put$")==0)
{
strcpy(Stk[1],"~put");
return;
}
break;
}
if(a==18)
{
if(str_cmp(Keyword,"remove")==0)
{
char Mat[2048];
char Fat[2048];
*Mat=0;
*Fat=0;
for(i=2; i<=Ndx; i+=1)
{
if(iMatchWrd(Stk[i],"from"))
{
*Stk[i]=0;
break;
}
}
for(j=2; j<=i; j+=1)
{
strcat(Mat,Stk[j]);
}
for(j=i; j<=Ndx; j+=1)
{
strcat(Fat,Stk[j]);
}
strcpy(lszTmp, join(5,"=remove$(",Fat,",",Mat,")"));
FastLexer(Fat," ()","");
strcpy(lszTmp, join(2,Stk[Ndx],lszTmp));
XParse(lszTmp);
TokenSubstitutions();
Emit();
Ndx=0;
return;
}
if(str_cmp(Keyword,"replace")==0)
{
if(Ndx<6)
{
Abort("Problem with REPLACE statement");
}
int W;
int I;
char VV[2048];
char RR[2048];
char WW[2048];
*VV=0;
*RR=0;
*WW=0;
for(W=2; W<=Ndx; W+=1)
{
if(iMatchWrd(Stk[W],"with"))
{
*Stk[W]=0;
break;
}
}
for(I=2; I<=Ndx; I+=1)
{
if(iMatchWrd(Stk[I],"in"))
{
*Stk[I]=0;
break;
}
}
i=I+1;
for(j=i; j<=Ndx; j+=1)
{
strcat(VV,Stk[j]);
}
for(j=2; j<=W; j+=1)
{
strcat(RR,Stk[j]);
}
i=W+1;
for(j=i; j<=I; j+=1)
{
strcat(WW,Stk[j]);
}
strcpy(lszTmp, join(7,"=replace$(",VV,",",RR,",",WW,")"));
FastLexer(VV," ()","");
strcpy(lszTmp, join(2,Stk[Ndx],lszTmp));
XParse(lszTmp);
TokenSubstitutions();
Emit();
Ndx=0;
return;
}
break;
}
if(a==27)
{
for(;;)
{
if(str_cmp(Keyword,"$ifndef")==0)
{
strcpy(Stk[1],"~ifndef");
InConditional++;
break;
}
if(str_cmp(Keyword,"$if")==0 || str_cmp(Keyword,"$ifdef")==0)
{
strcpy(Stk[1],"~if");
InConditional++;
break;
}
if(str_cmp(Keyword,"$else")==0)
{
strcpy(Stk[1],"~else");
break;
}
if(str_cmp(Keyword,"$elseif")==0)
{
strcpy(Stk[1],"~elseif");
break;
}
if(str_cmp(Keyword,"$endif")==0)
{
strcpy(Stk[1],"~endif");
InConditional--;
if(InConditional<0)
{
Abort("To many $ENDIFs");
}
break;
}
if(str_cmp(Keyword,"$cpp")==0)
{
Ndx=0;
UseCpp=TRUE;
break;
}
if(str_cmp(Keyword,"$CPP")==0)
{
Ndx=0;
UseCpp=TRUE;
}
break;
}
return;
}
break;
}
IFCond=0;
for(i=1; i<=Ndx; i+=1)
{
if(iMatchWrd(Stk[i],"if"))
{
IFCond=i+1;
}
if(iMatchWrd(Stk[i],"then")&&iMatchWrd(Stk[i+1],"if"))
{
for(j=i+2; j<=Ndx; j+=1)
{
if(iMatchWrd(Stk[j],"else"))
{
break;
}
}
if(j>Ndx)
{
for(j=i; j>=IFCond+1; j+=-1)
{
strcpy(Stk[j],Stk[j-1]);
}
strcpy(Stk[IFCond],"(");
i++;
strcpy(Stk[i],")");
i++;
for(j=Ndx; j>=i; j+=-1)
{
strcpy(Stk[j+2],Stk[j]);
}
Ndx++;
Ndx++;
strcpy(Stk[i],"&&");
i++;
strcpy(Stk[i],"(");
i++;
for(i=i; i<=Ndx; i+=1)
{
if(iMatchWrd(Stk[i],"then"))
{
Ndx++;
for(j=Ndx; j>=i; j+=-1)
{
strcpy(Stk[j],Stk[j-1]);
}
strcpy(Stk[i],")");
break;
}
}
i--;
}
else
{
break;
}
}
}
}
void Parse (char *Arg)
{
int A;
int B;
int CommaCnt;
int Tmp;
int i;
int j;
int k;
char lszTmp[2048];
char L_Stk_1[2048];
char L_Stk_2[2048];
char Var1[2048];
int Plus2Amp=0;
int vt;
*L_Stk_1=0;
*L_Stk_2=0;
*lszTmp=0;
*Var1=0;
XParse(Arg);
PassOne=0;
if(!iMatchWrd(Stk[1],"function"))
{
Plus2Amp=iMatchNQ(Arg,"&");
for(Tmp=2; Tmp<=Ndx-1; Tmp+=1)
{
if(str_cmp(Stk[Tmp],"+")==0)
{
vt=DataType(Stk[Tmp+1]);
if(vt==vt_STRVAR||vt==vt_STRLIT)
{
strcpy(Stk[Tmp],"&");
Plus2Amp=TRUE;
}
else
{
vt=DataType(Stk[Tmp-1]);
if(vt==vt_STRVAR||vt==vt_STRLIT)
{
strcpy(Stk[Tmp],"&");
Plus2Amp=TRUE;
}
}
}
}
if(Plus2Amp>0)
{
Use_Join=UseFlag=TRUE;
j=0;
k=0;
for(Tmp=1; Tmp<=Ndx-1; Tmp+=1)
{
A=CheckLocal(Stk[Tmp], &i);
if(A==vt_UNKNOWN)
{
A=CheckGlobal(Stk[Tmp], &i);
}
if(A==vt_STRUCT||A==vt_UDT||A==vt_UNION)
{
j=1;
}
if(str_cmp(Stk[Tmp],"&")==0)
{
A=DataType(Stk[Tmp+1]);
if(A==vt_STRVAR||A==vt_STRLIT)
{
k=1;
}
else
{
A=DataType(Stk[Tmp-1]);
if(A==vt_STRVAR||A==vt_STRLIT)
{
k=1;
}
}
}
}
if(k)
{
if(j)
{
AsmUnknownStructs(0);
}
JoinStrings(1,0);
*Src=0;
for(i=1; i<=Ndx; i+=1)
{
if(Stk[i][0])
{
strcpy(Src, join(3,Src,Stk[i]," "));
}
}
XParse(Src);
}
}
}
if(UseCpp)
{
if(iMatchNQ(Src,"->lpVtbl"))
{
{int i;
for(i=1; i<=Ndx; i+=1)
{
if(iMatchRgt(Stk[i],"->lpVtbl"))
{
strcpy(Stk[i],extract(Stk[i],"->lpVtbl"));
if((str_cmp(Stk[i+3],Stk[i-1])==0 || str_cmp(Stk[i+3],Stk[i])==0) && str_cmp(Stk[i+3],")")!=0)
{
*Stk[i+3]=0;
if(str_cmp(Stk[i+4],",")==0)
{
*Stk[i+4]=0;
}
}
}
}
}
RemEmptyTokens();
}
}
TokenSubstitutions();
if(Ndx==0)
{
return;
}
Transforms();
if(Ndx==0)
{
return;
}
if(iMatchWrd(Stk[1],"function"))
{
if(iMatchWrd(Stk[Ndx-2],"as")&&str_cmp(Stk[Ndx],")")!=0)
{
if(!iMatchWrd(Stk[Ndx],"export")&&!iMatchWrd(Stk[Ndx],"stdcall"))
{
strcpy(Stk[Ndx-1], join(3,Stk[Ndx-1]," ",Stk[Ndx]));
Ndx--;
}
}
}
if(iMatchWrd(Stk[1],"function")||iMatchWrd(Stk[1],"sub"))
{
int offset;
int LastBrk=Ndx-2;
for(i=Ndx; i>=3; i+=-1)
{
if(str_cmp(Stk[i],")")==0)
{
LastBrk=i;
break;
}
}
for(i=3; i<=LastBrk; i+=1)
{
offset=2;
if(iMatchWrd(Stk[i],"as")&&(i<LastBrk)&&str_cmp(Stk[i+offset],"=")!=0)
{
if(iMatchWrd(Stk[i+1],"function"))
{
offset=3;
}
if(!inchr(Stk[i+offset],")")&&!inchr(Stk[i+offset],","))
{
if(strlen(Stk[i+offset])!=0&&!iMatchWrd(Stk[i+3],"as"))
{
strcpy(Stk[i+offset-1], join(3,Stk[i+offset-1]," ",Stk[i+offset]));
*Stk[i+offset]=0;
}
}
}
}
}
if(!iMatchWrd(Stk[1],"declare"))
{
for(i=1; i<=Ndx; i+=1)
{
if(iMatchWrd(Stk[i],"lib"))
{
if(str_cmp(Stk[i-1],"(")==0 && (DataType(Stk[i+1])==vt_STRLIT||DataType(Stk[i+1])==vt_STRVAR))
{
j=GetNumArgs(i+2);
strcpy(lszTmp,"BCX_DynaCall");
if(!iMatchWrd(Stk[1],"print"))
{
if(DataType(Stk[i-2])==vt_STRVAR||DataType(Stk[1])==vt_STRVAR)
{
strcpy(lszTmp, join(2,"(char*)",lszTmp));
}
}
strcpy(Var1,right(Stk[i-2],1));
if(inchr("!$#¦%",Var1))
{
strcat(lszTmp,Var1);
strcpy(Stk[i],enc(left(Stk[i-2],strlen(Stk[i-2])-1)));
}
else
{
strcpy(Stk[i],enc(Stk[i-2]));
}
strcpy(Stk[i-2],lszTmp);
for(B=Ndx+3; B>=i+3; B+=-1)
{
strcpy(Stk[B],Stk[B-3]);
}
strcpy(Stk[i+2],Stk[i+1]);
strcpy(Stk[i+1],",");
strcpy(Stk[i+3],",");
strcpy(Stk[i+4],ltrim(str(j)));
strcpy(Stk[i+5],sziif(j,",",")"));
Ndx+=(3);
Use_Dynacall=TRUE;
}
}
}
}
if(inchr(Arg,"^"))
{
int lp=0;
int rp=0;
Test=FALSE;
for(i=1; i<=Ndx; i+=1)
{
if(str_cmp(Stk[i],"^")==0)
{
Test=TRUE;
if(str_cmp(Stk[i+1],"-")==0)
{
Ndx++;
for(A=Ndx; A>=i+2; A+=-1)
{
strcpy(Stk[A],Stk[A-1]);
}
strcpy(Stk[i+1],"(");
B=i+3;
if(str_cmp(Stk[B],"(")==0)
{
lp=0;
rp=0;
for(;;)
{
if(str_cmp(Stk[B],"(")==0)
{
lp++;
}
if(str_cmp(Stk[B],")")==0)
{
rp++;
}
B++;
if(lp==rp)
{
break;
}
}
Ndx++;
j=B+1;
for(A=Ndx; A>=j; A+=-1)
{
strcpy(Stk[A],Stk[A-1]);
}
strcpy(Stk[B],")");
}
else
{
B=i+4;
if(inchr("[",Stk[B]))
{
for(;;)
{
B++;
if(inchr("]",Stk[B]))
{
break;
}
}
Ndx++;
j=B+2;
for(A=Ndx; A>=j; A+=-1)
{
strcpy(Stk[A],Stk[A-1]);
}
strcpy(Stk[B+1],")");
}
else
{
if(inchr("(",Stk[B]))
{
for(;;)
{
B++;
if(inchr(")",Stk[B]))
{
break;
}
}
Ndx++;
j=B+2;
for(A=Ndx; A>=j; A+=-1)
{
strcpy(Stk[A],Stk[A-1]);
}
strcpy(Stk[B+1],")");
}
else
{
Ndx++;
j=B+1;
for(A=Ndx; A>=j; A+=-1)
{
strcpy(Stk[A],Stk[A-1]);
}
strcpy(Stk[B],")");
}
}
}
}
}
}
if(Test)
{
for(i=1; i<=Ndx; i+=1)
{
if(str_cmp(Stk[i],"^")==0)
{
A=i-1;
B=0;
while(str_cmp(Stk[A],"=")!=0)
{
if(str_cmp(Stk[A],"]")==0)
{
B++;
}
if(str_cmp(Stk[A],")")==0)
{
B++;
}
if(str_cmp(Stk[A],"[")==0)
{
B--;
}
if(str_cmp(Stk[A],"(")==0)
{
B--;
}
if(B==0)
{
break;
}
A--;
}
if(str_cmp(Stk[A],"[")==0)
{
A--;
}
if(str_cmp(Stk[A],"=")==0)
{
A++;
}
if(str_cmp(Stk[A],"(")==0)
{
B=DataType(Stk[A-1]);
if(!iMatchWrd(Stk[A-1],"print")&&(B==vt_INTEGER||B==vt_SINGLE||B==vt_DOUBLE))
{
A--;
}
}
strcpy(Arg,"pow(");
B=A-1;
while(B>0)
{
strcpy(Arg, join(4,Stk[B]," ",Arg," "));
B--;
}
for(B=A; B<=i-1; B+=1)
{
strcpy(Arg, join(3,Arg," ",Stk[B]));
}
strcat(Arg,",");
A=i+1;
B=DataType(Stk[A]);
if((str_cmp(Stk[A+1],"(")==0 || str_cmp(Stk[A+1],"[")==0) && (B==vt_INTEGER||B==vt_SINGLE||B==vt_DOUBLE))
{
A++;
}
B=0;
while(A<=Ndx)
{
if(str_cmp(Stk[A],"[")==0)
{
B++;
}
if(str_cmp(Stk[A],"(")==0)
{
B++;
}
if(str_cmp(Stk[A],"]")==0)
{
B--;
}
if(str_cmp(Stk[A],")")==0)
{
B--;
}
if(!B)
{
break;
}
A++;
}
for(B=i+1; B<=A; B+=1)
{
strcpy(Arg, join(3,Arg," ",Stk[B]));
}
strcat(Arg,")");
A++;
while(A<=Ndx)
{
strcpy(Arg, join(3,Arg," ",Stk[A]));
A++;
}
break;
}
}
Parse(Arg);
}
}
strcpy(L_Stk_1,lcase(Stk[1]));
strcpy(L_Stk_2,lcase(Stk[2]));
if(str_cmp(L_Stk_1,"$dll")==0)
{
MakeDLL=NoMain=TRUE;
if(IsApple)
{
strcpy(LD_FLAGS,"-fPIC -shared $FILE$.so");
}
else
{
strcpy(LD_FLAGS,"-fPIC -shared -Wl,-soname,$FILE$.so");
}
Ndx=0;
return;
}
IsCallBack=0;
if(iMatchWrd(Stk[Ndx],"callback"))
{
IsCallBack=1;
Ndx--;
}
if(str_cmp(L_Stk_1,"open")==0)
{
for(A=1; A<=Ndx; A+=1)
{
if(iMatchWrd(Stk[A],"binary"))
{
break;
}
}
if(A<Ndx)
{
A++;
strcpy(Var1,lcase(Stk[A]));
if(str_cmp(Var1,"new")==0)
{
strcpy(Stk[A-1],"binarynew");
for(i=A+1; i<=Ndx; i+=1)
{
strcpy(Stk[i-1],Stk[i]);
}
Ndx--;
}
if(str_cmp(Var1,"append")==0)
{
strcpy(Stk[A-1],"binaryappend");
for(i=A+1; i<=Ndx; i+=1)
{
strcpy(Stk[i-1],Stk[i]);
}
Ndx--;
}
if(str_cmp(Var1,"input")==0)
{
strcpy(Stk[A-1],"binaryinput");
for(i=A+1; i<=Ndx; i+=1)
{
strcpy(Stk[i-1],Stk[i]);
}
Ndx--;
}
if(str_cmp(Var1,"output")==0)
{
strcpy(Stk[A-1],"binaryoutput");
for(i=A+1; i<=Ndx; i+=1)
{
strcpy(Stk[i-1],Stk[i]);
}
Ndx--;
}
}
}
if(str_cmp(L_Stk_1,"option")==0 && str_cmp(L_Stk_2,"base")==0)
{
OptionBase=VAL(Stk[3]);
Ndx=0;
return;
}
if(str_cmp(L_Stk_1,"dim")==0)
{
if(str_cmp(L_Stk_2,"shared")==0 || str_cmp(L_Stk_2,"dynamic")==0 || str_cmp(L_Stk_2,"raw")==0 || str_cmp(L_Stk_2,"local")==0 || str_cmp(L_Stk_2,"auto")==0 || str_cmp(L_Stk_2,"register")==0 || str_cmp(L_Stk_2,"static")==0)
{
strcpy(Stk[1],L_Stk_2);
strcpy(L_Stk_1,L_Stk_2);
for(i=3; i<=Ndx; i+=1)
{
strcpy(Stk[i-1],Stk[i]);
}
Ndx--;
}
}
if(str_cmp(L_Stk_1,"public")==0)
{
if(str_cmp(L_Stk_2,"function")==0 || str_cmp(L_Stk_2,"sub")==0)
{
strcpy(Stk[1],L_Stk_2);
strcpy(L_Stk_1,L_Stk_2);
for(i=3; i<=Ndx; i+=1)
{
strcpy(Stk[i-1],Stk[i]);
}
Ndx--;
}
}
if(str_cmp(L_Stk_1,"private")==0)
{
if(str_cmp(L_Stk_2,"function")==0 || str_cmp(L_Stk_2,"sub")==0)
{
Use_Static=TRUE;
strcpy(Stk[1],L_Stk_2);
strcpy(L_Stk_1,L_Stk_2);
for(i=3; i<=Ndx; i+=1)
{
strcpy(Stk[i-1],Stk[i]);
}
Ndx--;
}
}
if(str_cmp(L_Stk_1,"onexit")==0)
{
if(str_cmp(L_Stk_2,"sub")==0)
{
Use_ExitCode=TRUE;
ExitNdx++;
strcpy(ExitSub[ExitNdx],Stk[3]);
strcpy(Stk[1],L_Stk_2);
strcpy(L_Stk_1,L_Stk_2);
for(i=3; i<=Ndx; i+=1)
{
strcpy(Stk[i-1],Stk[i]);
}
Ndx--;
}
}
if(str_cmp(L_Stk_1,"onstart")==0)
{
if(str_cmp(L_Stk_2,"sub")==0)
{
Use_StartupCode=TRUE;
StartNdx++;
strcpy(StartSub[StartNdx],Stk[3]);
strcpy(Stk[1],L_Stk_2);
strcpy(L_Stk_1,L_Stk_2);
for(i=3; i<=Ndx; i+=1)
{
strcpy(Stk[i-1],Stk[i]);
}
Ndx--;
}
}
if(str_cmp(L_Stk_1,"overloaded")==0 && str_cmp(L_Stk_2,"function")==0)
{
strcpy(Stk[1],"overloadedfunction");
strcpy(L_Stk_1,"overloadedfunction");
for(i=3; i<=Ndx; i+=1)
{
strcpy(Stk[i-1],Stk[i]);
}
Ndx--;
}
if(str_cmp(L_Stk_1,"overloadedfunction")==0 && str_cmp(Stk[2],"=")!=0)
{
OkayToSend=TRUE;
}
if(str_cmp(L_Stk_1,"overloaded")==0 && str_cmp(L_Stk_2,"sub")==0)
{
strcpy(Stk[1],"overloadedsub");
for(i=3; i<=Ndx; i+=1)
{
strcpy(Stk[i-1],Stk[i]);
}
Ndx--;
}
if(str_cmp(L_Stk_1,"function")==0 && iMatchWrd(Stk[3],"optional"))
{
strcpy(Stk[1],"optfunction");
strcpy(L_Stk_1,"optfunction");
for(i=4; i<=Ndx; i+=1)
{
strcpy(Stk[i-1],Stk[i]);
}
Ndx--;
}
if(str_cmp(L_Stk_1,"optfunction")==0 && str_cmp(Stk[2],"=")!=0)
{
OkayToSend=TRUE;
}
if(str_cmp(L_Stk_1,"sub")==0 && iMatchWrd(Stk[3],"optional"))
{
strcpy(L_Stk_1,"optsub");
strcpy(Stk[1],"optsub");
for(i=4; i<=Ndx; i+=1)
{
strcpy(Stk[i-1],Stk[i]);
}
Ndx--;
}
if(str_cmp(L_Stk_1,"end")==0 && str_cmp(Stk[2],"=")!=0)
{
strcpy(Stk[1], join(2,L_Stk_1,L_Stk_2));
Ndx=1;
}
if(str_cmp(L_Stk_1,"function")==0 && str_cmp(Stk[2],"=")!=0)
{
OkayToSend=TRUE;
}
if(str_cmp(L_Stk_1,"midstr")==0)
{
CommaCnt=0;
for(i=1; i<=Ndx; i+=1)
{
if(str_cmp(Stk[i],",")==0)
{
CommaCnt++;
}
else if(str_cmp(Stk[i],"=")==0)
{
if(CommaCnt<2)
{
strcpy(Stk[i],"-1,");
}
else
{
*Stk[i]=0;
}
strcpy(Stk[i-1],",");
Ndx++;
strcpy(Stk[Ndx],")");
break;
}
}
}
if(str_cmp(Stk[2],":")==0)
{
if(Ndx==2)
{
strcpy(Stk[1], join(2,ucase(Stk[1]),":"));
Ndx=1;
return;
}
}
if(str_cmp(L_Stk_1,"case")==0 && str_cmp(L_Stk_2,"else")==0)
{
Ndx=1;
strcpy(Stk[1],"caseelse");
}
for(i=1; i<=Ndx; i+=1)
{
if(iMatchWrd(Stk[i],"let"))
{
for(j=i+1; j<=Ndx; j+=1)
{
strcpy(Stk[j-1],Stk[j]);
}
Ndx--;
}
}
if(str_cmp(Stk[Ndx],"*")==0)
{
strcpy(Stk[Ndx-1], join(2,Stk[Ndx-1],"*"));
Ndx--;
}
if(TestState==TRUE)
{
if(LastCmd==0)
{
if(str_cmp(Stk[1],"*")==0)
{
strcpy(Z,Clean(Stk[2]));
}
else
{
strcpy(Z,Clean(Stk[1]));
}
if(str_cmp(left(Z,1),"*")==0)
{
strcpy(Z,mid(Z,2));
}
i=inchr(Z,".");
if(i==0)
{
i=instr_b(Z,"->");
}
if(i>0)
{
if(WithCnt)
{
strcpy(Z,WithVar[WithCnt]);
}
else
{
strcpy(Z,left(Z,i-1));
}
}
if(inchr(Z,"["))
{
strcpy(Z,extract(Z,"["));
}
if(CheckLocal(Z, &j)==vt_UNKNOWN)
{
if(CheckGlobal(Z, &j)==vt_UNKNOWN)
{
strcpy(Z,lcase(Z));
if(str_cmp(Stk[2],"=")==0 && str_cmp(Z,"functionreturn")!=0 && str_cmp(Z,"bcx_retstr")!=0 && str_cmp(Z,"end")!=0)
{
Warning(join(6,"Assignment before Declaration in Line ",str(ModuleLineNos[ModuleNdx])," in Module: ",trim(Modules[ModuleNdx]),": ",Src));
}
}
}
}
}
}
void FuncSubDecs1 (char *s)
{
int i;
int j;
if(iMatchWrd(Stk[1],s))
{
if(DataType(Stk[2])==vt_STRVAR)
{
Abort(join(3,"Invalid ",s,"name"));
}
}
for(i=1; i<=Ndx; i+=1)
{
if(str_cmp(Stk[i],"[")==0 && str_cmp(Stk[i+1],"]")==0)
{
if(iMatchWrd(Stk[i+2],"as"))
{
strcpy(Stk[i+3], join(2,Stk[i+3],"*"));
}
else if(str_cmp(Stk[i+2],"[")==0)
{
j=i-1;
while(i<=Ndx)
{
if(iMatchWrd(Stk[i],"as"))
{
break;
}
if(iMatchRgt(Stk[j],"]")&&inchr(",)=",Stk[i]))
{
break;
}
strcpy(Stk[j], join(2,Stk[j],Stk[i]));
*Stk[i++]=0;
}
continue;
}
else
{
if(DataType(Stk[i-1])==vt_STRVAR)
{
strcpy(Stk[i-1], join(2,Stk[i-1],"[][65535]"));
}
strcpy(Stk[i-1], join(2,"*",Stk[i-1]));
}
*Stk[i++]=0;
*Stk[i]=0;
}
}
RemEmptyTokens();
IsExported=FALSE;
if(iMatchWrd(Stk[Ndx],"export"))
{
Ndx--;
IsExported=TRUE;
if(UseStdCall)
{
strcpy(CallType,"__attribute__((stdcall)) ");
}
else
{
strcpy(CallType,"__attribute__((cdecl)) ");
}
}
}
void RemEmptyTokens (void)
{
int i;
int j;
for(i=1; i<=Ndx; i+=1)
{
if(!*Stk[i])
{
j=i;
while(!*Stk[j]&&(j<Ndx))
{
j++;
}
if(!*Stk[j])
{
break;
}
strcpy(Stk[i],Stk[j]);
*Stk[j]=0;
}
}
Ndx=i-1;
}
void FuncSubDecs2 (char *s, int method)
{
if(iMatchWrd(Stk[1],s))
{
if(iMatchWrd(Stk[Ndx-1],"as"))
{
Abort(join(2,"Attempted type assignment to ",s));
}
VarCode.IsPtrFlag=0;
CurrentFuncType=vt_VOID;
}
else
{
if(iMatchWrd(Stk[Ndx-1],"as"))
{
CurrentFuncType=CheckType(Stk[Ndx]);
strcpy(VarCode.Token,Stk[2]);
strcpy(VarCode.AsToken,Stk[Ndx]);
VarCode.IsPtrFlag=tally(Stk[Ndx],"*");
*Stk[Ndx]=0;
*Stk[Ndx-1]=0;
Ndx--;
Ndx--;
}
else
{
CurrentFuncType=DataType(Stk[2]);
strcpy(VarCode.Token,Stk[2]);
VarCode.IsPtrFlag=tally(Stk[2],"*");
*VarCode.AsToken=0;
}
}
strcpy(VarCode.Proto," (");
strcpy(VarCode.Header," (");
*VarCode.Functype=0;
VarCode.Method=method;
VarCode.VarNo=CurrentFuncType;
GetVarCode( &VarCode);
}
void FuncSubDecs3 (VARCODE* varcode)
{
if(*Stk[Ndx-1]==46)
{
strcat(varcode->Header,"...");
}
strcpy(varcode->Header,rtrim(varcode->Header));
if(iMatchRgt(varcode->Header,","))
{
midstr(varcode->Header,strlen(varcode->Header),-1,")");
}
else
{
strcat(varcode->Header,")");
}
strcpy(varcode->Header,replace(varcode->Header,"()","(void)"));
strcpy(varcode->Header, join(3,varcode->Functype,varcode->Token,varcode->Header));
if(varcode->Method==2)
{
if(*Stk[Ndx-1]==46)
{
strcat(varcode->Proto,"...");
}
strcpy(varcode->Proto,rtrim(varcode->Proto));
if(iMatchRgt(varcode->Proto,","))
{
midstr(varcode->Proto,strlen(varcode->Proto),-1,")");
}
else
{
strcat(varcode->Proto,")");
}
strcpy(varcode->Proto,replace(varcode->Proto,"()","(void)"));
strcpy(varcode->Proto, join(4,varcode->Functype,varcode->Token,varcode->Proto,";"));
}
if(IsExported)
{
strcpy(varcode->Proto, join(2,"C_EXPORT ",varcode->Proto));
strcpy(varcode->Header, join(2,"C_EXPORT ",varcode->Header));
}
}
void AddTypeDefs (char *TypeName, int TDef)
{
TypeDefsCnt++;
if(TypeDefsCnt==MaxTypes)
{
Abort("Exceeded TYPE Limits.");
}
strcpy(TypeDefs[TypeDefsCnt].VarName,TypeName);
TypeDefs[TypeDefsCnt].TypeofDef=TDef;
TypeDefs[TypeDefsCnt].EleCnt=0;
}
int DefsID (char *ZZ)
{
int i;
if(TypeDefsCnt>0)
{
for(i=1; i<=TypeDefsCnt; i+=1)
{
if(str_cmp(ZZ,TypeDefs[i].VarName)==0)
{
return i;
}
}
}
return 0;
}
void GetTypeInfo (char *stk, int* IsPointer, int* UdtIdx, int* vtCode)
{
char Var1[2048];
(*IsPointer)=tally(stk,"*");
strcpy(Var1,RemoveStr(stk,"*"));
if(str_cmp(right(Var1,6),"_CLASS")==0)
{
strcpy(Var1,left(Var1,strlen(Var1)-6));
}
(*vtCode)=CheckType(Var1);
if((*vtCode)==vt_UNKNOWN)
{
AddTypeDefs(Var1,vt_UDT);
(*vtCode)=vt_UDT;
}
(*UdtIdx)=0;
if((*vtCode)==vt_STRUCT||(*vtCode)==vt_UNION||(*vtCode)==vt_UDT)
{
(*UdtIdx)=DefsID(Var1);
}
}
void AddTypedefElement (int WorkingTypeDefsCnt, int ElType, char *EName, char *EType, int EPtr)
{
UserTypeDefs* TD;
TD= &(TypeDefs[WorkingTypeDefsCnt]);
if(TD->EleCnt==MaxElements)
{
Abort("Exceeded TYPE Element Limits.");
}
TD->Elements[TD->EleCnt].ElementType=ElType;
TD->Elements[TD->EleCnt].ElementDynaPtr=EPtr;
if(ElType==vt_STRUCT||ElType==vt_UNION||ElType==vt_UDT)
{
TD->Elements[TD->EleCnt].ElementID=DefsID(EType);
}
else
{
TD->Elements[TD->EleCnt].ElementID=0;
}
strcpy(TD->Elements[TD->EleCnt].ElementName,EName);
TD->EleCnt=1+TD->EleCnt;
}
char * GetElement (int StartStk, int* vt, int* dms, int id)
{
char *BCX_RetStr={0};
int BC=0;
int i;
char ZZ[2048];
for(i=StartStk+1; i<=Ndx; i+=1)
{
if(str_cmp(Stk[i],"[")==0)
{
BC++;
}
else if(str_cmp(Stk[i],"]")==0)
{
BC--;
}
else if(BC==0)
{
if(iMatchLft(Stk[i],"->")||*Stk[i]==46)
{
strcpy(ZZ,Clean(Stk[i]));
RemoveAll(ZZ,".->(*)",1);
(*vt)=GetElementInfo( &id,dms,ZZ);
if((*vt)!=vt_STRUCT&&(*vt)!=vt_UNION)
{
break;
}
}
}
}
if((*vt)==vt_UDT||(*vt)==vt_UNION||(*vt)==vt_STRUCT)
{
strcpy(ZZ,TypeDefs[id].VarName);
}
else
{
strcpy(ZZ,GetVarTypeName(*vt));
}
BCX_RetStr=BCX_TmpStr(strlen(ZZ));
strcpy(BCX_RetStr,ZZ);
return BCX_RetStr;
}
int GetElementInfo (int* DefID, int* EPtr, char *Elename)
{
int i;
int id;
id=(*DefID);
for(i=0; i<=TypeDefs[id].EleCnt-1; i+=1)
{
if(str_cmp(Elename,TypeDefs[id].Elements[i].ElementName)==0)
{
(*DefID)=TypeDefs[id].Elements[i].ElementID;
(*EPtr)=TypeDefs[id].Elements[i].ElementDynaPtr;
return TypeDefs[id].Elements[i].ElementType;
}
}
return 0;
}
void HandleNonsense (void)
{
int i;
for(i=1; i<=Ndx; i+=1)
{
if(iMatchWrd(Stk[i],"as"))
{
strcpy(Stk[i-1],Clean(Stk[i-1]));
}
if(OptionBase)
{
if(str_cmp(Stk[i],"[")==0)
{
strcpy(Stk[i+1], join(3,ltrim(str(OptionBase)),"+",Stk[i+1]));
}
}
}
}
void ValidVar (char *v)
{
char *ZZ;
ZZ=(char*)calloc(256+65535,1);
if(!isalpha(*v)&&*v!=95)
{
if(!iMatchLft(v,"(*"))
{
Abort("Invalid String Variable Name");
}
}
if(RestrictedWords(v)&&TestState)
{
strcpy(ZZ, join(3,"Variable ",v," on line"));
strcpy(ZZ, join(5,ZZ,str(ModuleLineNos[ModuleNdx])," in Module: ",trim(Modules[ModuleNdx])," is a Restricted Word"));
Warning(ZZ);
}
if(ZZ)free(ZZ);
}
void PointerFix (void)
{
strcpy(Stk[Ndx-1], join(2,Stk[Ndx-1],Stk[Ndx]));
Stk[Ndx][0]=0;
Ndx--;
while(tally(Stk[Ndx],"*")==strlen(Stk[Ndx]))
{
strcpy(Stk[Ndx-1], join(2,Stk[Ndx-1],Stk[Ndx]));
Stk[Ndx][0]=0;
Ndx--;
}
}
void DimDynaString (char *SVar, int DG, int s)
{
int A;
char DS[2048];
strcpy(DS, join(5,"if(",SVar,")free(",SVar,");"));
if(InFunc&&(IsLocal||IsDim||IsRaw||IsAuto||IsRegister)&&DG==0)
{
LocalDynaCnt++;
strcpy(DynaStr[LocalDynaCnt],DS);
if(IsAuto)
{
fprintf(Outfile,"%s%s%s%s\n",Scoot,"char *",SVar,";");
}
else if(IsRegister)
{
fprintf(Outfile,"%s%s%s%s\n",Scoot,"register char *",SVar,";");
}
else
{
fprintf(Outfile,"%s%s%s%s\n",Scoot,"char *",SVar,";");
}
AddLocal(SVar,vt_CHAR,0,"",1,0,0);
}
else
{
if(Use_GenFree)
{
GlobalDynaCnt++;
strcpy(GlobalDynaStr[GlobalDynaCnt],DS);
}
if(DG==2)
{
AddGlobal(SVar,vt_CHAR,0,"",1,0,1,0);
}
else
{
if(s)
{
AddGlobal(SVar,vt_CHAR,0,"",1,0,2,0);
}
else
{
AddGlobal(SVar,vt_CHAR,0,"",1,0,0,0);
}
}
}
if(DG!=2)
{
fprintf(Outfile,"%s%s%s",Scoot,SVar,"=(char*)calloc(256+");
for(A=4; A<=Ndx; A+=1)
{
fprintf(Outfile,"%s",Clean(Stk[A]));
}
fprintf(Outfile,"%s\n",",1);");
}
}
int SubFuncTest (void)
{
if(iMatchWrd(Stk[2],"function")||iMatchWrd(Stk[2],"sub"))
{
return 1;
}
return 0;
}
int DimSubFunc (int IsDynamic)
{
int i;
char lszTmp[2048];
int StartPoint=3;
int Funptr=0;
*lszTmp=0;
if(iMatchWrd(Stk[Ndx],"stdcall"))
{
strcpy(CallType,"__attribute__((stdcall)) ");
Ndx--;
IsStdFunc=TRUE;
}
else
{
strcpy(CallType,"__attribute__((cdecl)) ");
IsStdFunc=FALSE;
}
static struct _functionParse FP;
memset(&FP,0,sizeof(FP));
SepFuncArgs(3, &FP,TRUE);
StartPoint=_MAX_(FP.CommaPos[0],3);
if(!InTypeDef)
{
SFPOINTER=TRUE;
if(FP.NumArgs==0)
{
i=_MIN_(FP.CommaPos[1]+1,Ndx);
}
else
{
i=_MIN_(FP.CommaPos[FP.NumArgs]+1,Ndx);
}
if(str_cmp(Stk[i],"=")==0)
{
*Stk[i++]=0;
while(!iMatchWrd(Stk[i],"as")&&i<=Ndx)
{
strcat(lszTmp,Stk[i]);
*Stk[i++]=0;
}
RemoveAll(lszTmp,"{}",1);
if(lszTmp[0]!=0)
{
RemEmptyTokens();
}
}
if(!InNameSpace)
{
fprintf(FP4,"%s%s\n",MakeDecProto( &FP),";");
}
SFPOINTER=FALSE;
Ndx=StartPoint;
*Stk[2]=0;
if(lszTmp[0]!=0)
{
strcpy(Stk[Ndx++],"=");
strcpy(Stk[Ndx++],"{");
strcpy(Stk[Ndx++],Clean(lszTmp));
strcpy(Stk[Ndx++],"}");
}
strcpy(Stk[Ndx++],"as");
strcpy(Stk[Ndx], join(3,Clean(Stk[3]),"_TYPE",stringx(Funptr,42)));
RemEmptyTokens();
return FALSE;
}
else
{
if(iMatchWrd(Stk[2],"constructor")||iMatchWrd(Stk[2],"destructor"))
{
fprintf(Outfile,"%s%s%s%s\n",LF,Scoot,MakeDecProto( &FP),";");
}
else if(Use_Virtual)
{
fprintf(Outfile,"%s%s%s%s%s\n",Scoot,"virtual ",MakeDecProto( &FP),vproc,";");
Use_Virtual=FALSE;
}
else
{
fprintf(Outfile,"%s%s%s\n",Scoot,MakeDecProto( &FP),";");
}
}
return TRUE;
}
void Emit (void)
{
int HasStorage=0;
int A;
int B;
int i;
int j;
int Tmp;
int FuncRetnFlag;
int IsPointer=0;
int VType;
int id=0;
int k=0;
int vt=0;
char Arg[2048];
char CVar[2048];
char Keyword[2048];
char lszTmp[2048];
char Var1[2048];
char *ZZ;
ZZ=(char*)calloc(256+65535,1);
int IsSubOrFuncPtr;
int dms;
static int NoBreak;
static int NoBreak2;
FuncRetnFlag=0;
*lszTmp=0;
*ZZ=0;
strcpy(Keyword,lcase(Stk[1]));
if(NoBreak2&&!iMatchLft(Keyword,"case")&&!iMatchWrd(Keyword,"endselect"))
{
NoBreak2=0;
}
EMITAGAIN:;
if(Ndx==0)
{
if(ZZ)free(ZZ);
return;
}
Statements++;
if(iMatchRgt(Stk[1],":"))
{
fprintf(Outfile,"%s\n","");
fprintf(Outfile,"%s%s\n",ucase(Stk[1]),";");
if(ZZ)free(ZZ);
return;
}
for(i=1; i<=Ndx; i+=1)
{
strcpy(Stk[i],replace(Stk[i],chr(-15),":"));
}
if((CurrentFuncType==vt_STRVAR)&&InFunc&&OkayToSend)
{
fprintf(Outfile,"%s%s\n",Scoot,"char *BCX_RetStr={0};");
OkayToSend=0;
}
strcpy(Lookup,lcase(Stk[1]));
for(;;)
{
if(str_cmp(Lookup,"fprint")==0 || str_cmp(Lookup,"sprint")==0)
{
int IsLprint=FALSE;
int IsSprint=FALSE;
if(iMatchWrd(Stk[1],"sprint"))
{
IsSprint=TRUE;
}
if(IsNumber(Stk[2]))
{
strcpy(Stk[2], join(2,"FP",Stk[2]));
}
if(IsSprint)
{
strcpy(Handl,Clean(Stk[2]));
}
else
{
if(str_cmp(lcase(Stk[2]),"stderr")==0)
{
strcpy(Handl,lcase(Stk[2]));
}
else
{
if(CheckLocal(Stk[2], &i)==vt_UNKNOWN)
{
if(CheckGlobal(Stk[2], &i)==vt_UNKNOWN)
{
AddGlobal(Stk[2],vt_FILEPTR,0,"",0,0,0,0);
}
}
*Handl=0;
for(i=2; i<=Ndx; i+=1)
{
if(*Stk[i]==44||*Stk[i]==59)
{
*Stk[i]=0;
break;
}
strcat(Handl,Stk[i]);
*Stk[i]=0;
}
strcat(Handl,"@");
}
}
*Stk[2]=0;
*Stk[3]=0;
if(IsSprint)
{
strcpy(ZZ, join(2,"s",PrintWriteFormat(0)));
strcpy(ZZ,RemoveStr(ZZ,"\\n"));
}
else
{
strcpy(ZZ, join(2,"f",PrintWriteFormat(0)));
}
strcpy(ZZ, join(4,left(ZZ,8),RemoveStr(Handl,"@"),",",mid(ZZ,9)));
fprintf(Outfile,"%s%s\n",Scoot,ZZ);
break;
}
if(str_cmp(Lookup,"end")==0)
{
if(Ndx==1)
{
fprintf(Outfile,"%s%s\n",Scoot,"fflush(stdout);");
fprintf(Outfile,"%s%s\n",Scoot,"exit(0);");
break;
}
if(str_cmp(Stk[2],"=")==0)
{
fprintf(Outfile,"%s%s\n",Scoot,"fflush(stdout);");
fprintf(Outfile,"%s%s",Scoot,"exit(");
for(Tmp=3; Tmp<=Ndx; Tmp+=1)
{
fprintf(Outfile,"%s",Clean(Stk[Tmp]));
}
fprintf(Outfile,"%s\n",");");
break;
}
if(iMatchWrd(Stk[2],"if"))
{
BumpDown();
fprintf(Outfile,"%s%s\n",Scoot,"}");
BumpDown();
break;
}
break;
}
if(str_cmp(Lookup,"endif")==0)
{
BumpDown();
fprintf(Outfile,"%s%s\n",Scoot,"}");
BumpDown();
break;
}
if(str_cmp(Lookup,"if")==0)
{
EmitIfCond("if");
break;
}
if(str_cmp(Lookup,"elseif")==0)
{
BumpDown();
fprintf(Outfile,"%s%s\n",Scoot,"}");
BumpDown();
EmitIfCond("else if");
break;
}
if(str_cmp(Lookup,"for")==0)
{
int FFlg=0;
int For1=0;
int For2=0;
int For3=0;
int For4=0;
char Reg[2048];
char xxx[2048];
char yyy[2048];
char zzz[2048];
char qqq[2048];
*Reg=0;
*xxx=0;
*yyy=0;
*zzz=0;
*qqq=0;
for(i=Ndx; i>=1; i+=-1)
{
if(iMatchWrd(Stk[i],"step"))
{
FFlg=TRUE;
break;
}
}
if(!FFlg)
{
Ndx++;
strcpy(Stk[Ndx],"step");
Ndx++;
strcpy(Stk[Ndx],"1");
}
Test=FALSE;
for(i=1; i<=Ndx; i+=1)
{
if(str_cmp(Stk[i],"=")==0)
{
Test=TRUE;
}
}
if(Test==FALSE)
{
Abort("Missing =");
}
Test=FALSE;
for(i=1; i<=Ndx; i+=1)
{
if(iMatchWrd(Stk[i],"to"))
{
Test=TRUE;
}
}
if(Test==FALSE)
{
Abort("Missing TO");
}
strcpy(Reg,lcase(Stk[2]));
for(;;)
{
if(str_cmp(Reg,"int")==0 || str_cmp(Reg,"fint")==0)
{
strcpy(Reg,SPC);
LoopLocalVar[LoopLocalCnt++]=1;
fprintf(Outfile,"%s%s",Scoot," {int ");
break;
}
if(str_cmp(Reg,"single")==0 || str_cmp(Reg,"float")==0)
{
strcpy(Reg,SPC);
LoopLocalVar[LoopLocalCnt++]=1;
fprintf(Outfile,"%s%s",Scoot," {float ");
break;
}
if(str_cmp(Reg,"double")==0)
{
strcpy(Reg,SPC);
LoopLocalVar[LoopLocalCnt++]=1;
fprintf(Outfile,"%s%s",Scoot," {double ");
break;
}
if(str_cmp(Reg,"ldouble")==0)
{
strcpy(Reg,SPC);
LoopLocalVar[LoopLocalCnt++]=1;
fprintf(Outfile,"%s%s",Scoot," {LDOUBLE ");
break;
}
// case else
{
*Reg=0;
LoopLocalVar[LoopLocalCnt++]=0;
}
break;
}
if(strlen(Reg))
{
for(j=3; j<=Ndx; j+=1)
{
strcpy(Stk[j-1],Stk[j]);
}
Ndx--;
}
for(i=2; i<=Ndx; i+=1)
{
if(str_cmp(Stk[i],"=")==0)
{
For1=i-1;
break;
}
}
for(i=For1+2; i<=Ndx; i+=1)
{
if(iMatchWrd(Stk[i],"to"))
{
For2=i-1;
break;
}
}
for(i=For2+2; i<=Ndx; i+=1)
{
if(iMatchWrd(Stk[i],"step"))
{
For3=i-1;
break;
}
}
For4=For3+2;
for(i=2; i<=For1; i+=1)
{
strcat(xxx,Stk[i]);
}
for(i=For1+2; i<=For2; i+=1)
{
strcat(yyy,Stk[i]);
}
for(i=For2+2; i<=For3; i+=1)
{
strcat(zzz,Stk[i]);
}
for(i=For4; i<=Ndx; i+=1)
{
strcat(qqq,Stk[i]);
}
strcpy(xxx,Clean(xxx));
strcpy(yyy,Clean(yyy));
strcpy(zzz,Clean(zzz));
strcpy(qqq,Clean(qqq));
if(str_cmp(Reg,SPC)==0)
{
fprintf(Outfile,"%s%s\n",xxx,";");
}
*Reg=0;
if(IsNumberEx(qqq))
{
if(str_cmp(left(qqq,1),"-")==0)
{
fprintf(Outfile,"%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s\n",Scoot,"for(",Reg,xxx,"=",yyy,"; ",xxx,">=",zzz,"; ",xxx,"+=",qqq,")");
}
else
{
fprintf(Outfile,"%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s\n",Scoot,"for(",Reg,xxx,"=",yyy,"; ",xxx,"<=",zzz,"; ",xxx,"+=",qqq,")");
}
}
else
{
fprintf(Outfile,"%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s\n",Scoot,"for(",Reg,xxx,"=",yyy,"; ",qqq,">=0 ? ",xxx,"<=",zzz," : ",xxx,">=",zzz,"; ",xxx,"+=",qqq,")");
}
BumpUp();
fprintf(Outfile,"%s%s\n",Scoot,"{");
BumpUp();
break;
}
if(str_cmp(Lookup,"next")==0)
{
BumpDown();
fprintf(Outfile,"%s%s\n",Scoot,"}");
if(LoopLocalVar[--LoopLocalCnt])
{
fprintf(Outfile,"%s%s\n",Scoot,"}");
}
if(LoopLocalCnt<0)
{
Abort("Next without For");
}
BumpDown();
break;
}
if(str_cmp(Lookup,"do")==0)
{
fprintf(Outfile,"%s%s\n",Scoot,"for(;;)");
BumpUp();
fprintf(Outfile,"%s%s\n",Scoot,"{");
BumpUp();
break;
}
if(str_cmp(Lookup,"loop")==0)
{
BumpDown();
fprintf(Outfile,"%s%s\n",Scoot,"}");
BumpDown();
break;
}
if(str_cmp(Lookup,"caseelse")==0)
{
CaseElseFlag[Pusher]=TRUE;
if(CaseFlag)
{
if(NoBreak2==0)
{
fprintf(Outfile,"%s%s\n",Scoot,"break;");
}
BumpDown();
fprintf(Outfile,"%s%s\n",Scoot,"}");
fprintf(Outfile,"%s%s\n",Scoot,"// case else");
fprintf(Outfile,"%s%s\n",Scoot,"{");
BumpUp();
}
break;
}
if(str_cmp(Lookup,"endselect")==0)
{
if(CaseFlag)
{
BumpDown();
fprintf(Outfile,"%s%s\n",Scoot,"}");
}
BumpDown();
if(CaseElseFlag[Pusher]==0||NoBreak2==0)
{
fprintf(Outfile,"%s%s\n",Scoot,"break;");
}
BumpDown();
fprintf(Outfile,"%s%s\n",Scoot,"}");
NoBreak2=CaseElseFlag[Pusher]=0;
Pop(CaseVar);
break;
}
if(str_cmp(Lookup,"else")==0)
{
BumpDown();
fprintf(Outfile,"%s%s\n",Scoot,"}");
BumpDown();
fprintf(Outfile,"%s%s\n",Scoot,"else");
BumpUp();
fprintf(Outfile,"%s%s\n",Scoot,"{");
BumpUp();
break;
}
if(str_cmp(Lookup,"case")==0)
{
for(i=2; i<=Ndx; i+=1)
{
if(str_cmp(Stk[i],"%")==0)
{
strcpy(Stk[i]," % ");
}
if(str_cmp(Stk[i],"!=")==0)
{
strcpy(Stk[i],"<>");
}
if(str_cmp(Stk[i],"!")==0 && str_cmp(Stk[i+1],"=")==0)
{
strcpy(Stk[i],"<>");
*Stk[i+1]=0;
}
if(isalpha(Stk[i][0]))
{
strcat(Stk[i]," ");
}
}
*szTmp=0;
Test=FALSE;
if(DataType(CaseVar)==vt_STRVAR)
{
Test=TRUE;
}
i=0;
for(A=2; A<=Ndx; A+=1)
{
if(inchr("([",Stk[A]))
{
i++;
}
if(inchr(")]",Stk[A]))
{
i--;
}
if(i)
{
strcat(szTmp,Stk[A]);
continue;
}
if(str_cmp(Stk[A],",")==0)
{
if(!inchr("<>=",Stk[A+1]))
{
strcpy(szTmp, join(4,szTmp," or ",CaseVar,"="));
}
else
{
strcpy(szTmp, join(3,szTmp," or ",CaseVar));
}
*Stk[A]=0;
continue;
}
if(str_cmp(Stk[A],"&&")==0)
{
strcpy(szTmp, join(3,szTmp," and ",CaseVar));
*Stk[A]=0;
}
else if(str_cmp(Stk[A],"||")==0)
{
strcpy(szTmp, join(3,szTmp," or ",CaseVar));
*Stk[A]=0;
}
else
{
strcat(szTmp,Stk[A]);
}
}
if(CaseFlag==0)
{
NoBreak=0;
}
if(CaseFlag)
{
if(NoBreak==0)
{
if(NoBreak2==0)
{
fprintf(Outfile,"%s%s\n",Scoot,"break;");
}
}
BumpDown();
fprintf(Outfile,"%s%s\n",Scoot,"}");
BumpDown();
}
CaseFlag=TRUE;
if(iMatchLft(CaseVar," BAND "))
{
NoBreak=1;
strcpy(Src, join(4,"IF ",szTmp,CaseVar," Then "));
}
else
{
if(inchr("<>=",szTmp)&&!IsQuoted(szTmp))
{
strcpy(Src, join(4,"IF ",CaseVar,szTmp," Then "));
}
else
{
strcpy(Src, join(5,"IF ",CaseVar," = ",szTmp," Then "));
}
}
Parse(Src);
Emit();
break;
}
if(str_cmp(Lookup,"delay")==0)
{
*lszTmp=0;
for(i=2; i<=Ndx; i+=1)
{
strcat(lszTmp,Clean(Stk[i]));
}
fprintf(Outfile,"%s%s%s%s\n",Scoot,"sleep(",lszTmp,");");
break;
}
if(str_cmp(Lookup,"qsortidx")==0)
{
*lszTmp=0;
strcpy(Var,Clean(Stk[2]));
for(i=4; i<=Ndx-4; i+=1)
{
strcat(lszTmp,Stk[i]);
}
strcpy(lszTmp,Clean(lszTmp));
fprintf(Outfile,"%s%s%s%s\n",Scoot,"Key = ",Stk[Ndx],";");
if(str_cmp(Var,"0")!=0)
{
fprintf(Outfile,"%s%s\n",Scoot,"int iDx;");
fprintf(Outfile,"%s%s%s%s",Scoot,"for(iDx=0; iDx<",lszTmp,"; iDx+=1) ");
fprintf(Outfile,"%s%s\n",Var,"[iDx]=iDx;");
}
if(!inchr(Stk[Ndx-2],"."))
{
Use_Idxqsort=TRUE;
fprintf(Outfile,"%s%s%s%s\n",Scoot,"pppStr = ",Clean(Stk[Ndx-2]),";");
fprintf(Outfile,"%s%s%s%s%s%s\n",Scoot,"qsort(",Var,",",lszTmp,",sizeof(int),IdxCompare);");
}
else
{
char Stptr[2048];
char StMem[2048];
char StName[2048];
strcpy(StMem,remain(Clean(Stk[Ndx-2]),"."));
strcpy(Stptr,extract(Stk[Ndx-2],"."));
if(CheckLocal(Stptr, &i)!=vt_UNKNOWN)
{
strcpy(StName,TypeDefs[LocalVars[i].VarDef].VarName);
}
else if(CheckGlobal(Stptr, &i)!=vt_UNKNOWN)
{
strcpy(StName,TypeDefs[GlobalVars[i].VarDef].VarName);
}
if(str_cmp(Var,"0")!=0)
{
Use_IdxqsortSt=TRUE;
fprintf(Outfile,"%s%s%s%s%s%s%s%s\n",Scoot,"cmp1 =(char*)(",Stptr,") + offsetof(",StName,",",StMem,");");
fprintf(Outfile,"%s%s%s%s\n",Scoot,"StructSize = sizeof(",StName,");");
fprintf(Outfile,"%s%s%s%s%s%s\n",Scoot,"qsort(",Var,",",lszTmp,",sizeof(int),IdxCompareSt);");
}
else
{
Use_PtrqsortSt=TRUE;
fprintf(Outfile,"%s%s%s%s%s%s\n",Scoot,"OffSet = offsetof(",StName,",",StMem,");");
fprintf(Outfile,"%s%s%s%s%s%s%s%s\n",Scoot,"qsort(",Stptr,",",lszTmp,",sizeof(",StName,"),PtrCompareSt);");
}
}
break;
}
if(str_cmp(Lookup,"qsort")==0)
{
int QST=0;
int order=0;
if(iMatchWrd(Stk[2],"dynamic"))
{
QST=TRUE;
for(j=3; j<=Ndx; j+=1)
{
strcpy(Stk[j-1],Stk[j]);
}
Ndx--;
}
if(str_cmp(lcase(Stk[Ndx]),"ascending")==0)
{
order=2;
Ndx--;
Ndx--;
}
if(str_cmp(lcase(Stk[Ndx]),"descending")==0)
{
order=1;
Ndx--;
Ndx--;
}
if(order==0)
{
order=2;
}
*lszTmp=0;
for(i=4; i<=Ndx; i+=1)
{
strcat(lszTmp,Stk[i]);
}
strcpy(Var,Clean(Stk[2]));
vt=DataType(Stk[2]);
if(vt!=vt_STRVAR&&vt!=vt_INTEGER&&vt!=vt_SINGLE&&vt!=vt_DOUBLE)
{
vt=CheckType(Stk[2]);
}
fprintf(Outfile,"%s%s%s%s%s",Scoot,"qsort(",Var,",",Clean(lszTmp));
for(;;)
{
if(vt==vt_STRVAR)
{
if(!QST)
{
if(order==1)
{
fprintf(Outfile,"%s%s%s\n",",sizeof(",Var,"[0]),StrCompareD);");
Use_Strqsortd=TRUE;
}
else
{
fprintf(Outfile,"%s%s%s\n",",sizeof(",Var,"[0]),StrCompareA);");
Use_Strqsorta=TRUE;
}
}
else
{
if(order==1)
{
fprintf(Outfile,"%s%s%s\n",",sizeof(",Var,"[0]),DynStrCompareD);");
Use_DynStrqsortd=TRUE;
}
else
{
fprintf(Outfile,"%s%s%s\n",",sizeof(",Var,"[0]),DynStrCompareA);");
Use_DynStrqsorta=TRUE;
}
}
break;
}
if(vt==vt_INTEGER)
{
if(order==1)
{
fprintf(Outfile,"%s\n",",sizeof(int),NumCompareDint);");
Use_Numqsortdint=TRUE;
}
else
{
fprintf(Outfile,"%s\n",",sizeof(int),NumCompareAint);");
Use_Numqsortaint=TRUE;
}
break;
}
if(vt==vt_SINGLE)
{
if(order==1)
{
fprintf(Outfile,"%s\n",",sizeof(float),NumCompareDfloat);");
Use_Numqsortdfloat=TRUE;
}
else
{
fprintf(Outfile,"%s\n",",sizeof(float),NumCompareAfloat);");
Use_Numqsortafloat=TRUE;
}
break;
}
if(vt==vt_DOUBLE)
{
if(order==1)
{
fprintf(Outfile,"%s\n",",sizeof(double),NumCompareDdouble);");
Use_Numqsortddouble=TRUE;
}
else
{
fprintf(Outfile,"%s\n",",sizeof(double),NumCompareAdouble);");
Use_Numqsortadouble=TRUE;
}
break;
}
// case else
{
if(order==1)
{
fprintf(Outfile,"%s\n",",sizeof(int),NumCompareDint);");
Use_Numqsortdint=TRUE;
}
else
{
fprintf(Outfile,"%s\n",",sizeof(int),NumCompareAint);");
Use_Numqsortaint=TRUE;
}
}
break;
}
break;
}
if(str_cmp(Lookup,"endprogram")==0)
{
fprintf(Outfile,"%s\n"," return 0; // End of main program");
fprintf(Outfile,"%s\n","}\n\n");
EndOfProgram=1;
break;
}
if(str_cmp(Lookup,"~ifndef")==0)
{
strcpy(InIfDef,"#ifndef ");
for(i=2; i<=Ndx; i+=1)
{
strcpy(InIfDef, join(3,InIfDef,Stk[i]," "));
}
strcpy(InIfDef,trim(InIfDef));
if(InFunc||InMain)
{
fprintf(Outfile,"%s\n",InIfDef);
}
else
{
fprintf(FP6,"%s\n",InIfDef);
}
break;
}
if(str_cmp(Lookup,"~if")==0)
{
strcpy(InIfDef,"#if defined ");
for(i=2; i<=Ndx; i+=1)
{
strcpy(InIfDef, join(3,InIfDef,Stk[i]," "));
}
strcpy(InIfDef,trim(InIfDef));
strcpy(ConstLastDef,InIfDef);
if(InFunc)
{
if(Outfile==FP3)
{
fprintf(Outfile,"%s\n","// FP3");
}
if(Outfile==FP2)
{
fprintf(Outfile,"%s\n","// FP2");
}
fprintf(Outfile,"%s%s\n",InIfDef,"// OUTFILE");
strcpy(InIfDef,"FP3");
}
else if(InMain)
{
fprintf(Outfile,"%s%s\n",InIfDef,"// --FP2--");
}
break;
}
if(str_cmp(Lookup,"~else")==0)
{
strcpy(InIfDef,"#else");
strcpy(ConstLastDef,InIfDef);
if(InFunc||InMain)
{
fprintf(Outfile,"%s\n",InIfDef);
}
else
{
fprintf(FP6,"%s\n",InIfDef);
}
break;
}
if(str_cmp(Lookup,"~elseif")==0)
{
strcpy(InIfDef,"#elif defined ");
for(i=2; i<=Ndx; i+=1)
{
strcpy(InIfDef, join(3,InIfDef,Stk[i]," "));
}
strcpy(InIfDef,trim(InIfDef));
strcpy(ConstLastDef,InIfDef);
if(InFunc||InMain)
{
fprintf(Outfile,"%s\n",InIfDef);
}
else
{
fprintf(FP6,"%s\n",InIfDef);
}
break;
}
if(str_cmp(Lookup,"~endif")==0)
{
if(str_cmp(InIfDef,"FP3")==0)
{
fprintf(FP3,"%s\n","#endif // FP3");
}
else
{
fprintf(Outfile,"%s\n","#endif // Main");
}
if(str_cmp(ConstLastDef,"FP6")==0)
{
fprintf(FP6,"%s\n","#endif // FP6");
}
strcpy(InIfDef,"#endif // other");
if(InConditional==0)
{
*InIfDef=0;
*ConstLastDef=0;
}
break;
}
if(str_cmp(Lookup,"incr")==0)
{
j=FALSE;
fprintf(Outfile,"%s",Scoot);
for(i=2; i<=Ndx; i+=1)
{
if(str_cmp(Stk[i],",")==0)
{
fprintf(Outfile,"%s","+=(");
j=TRUE;
}
else
{
fprintf(Outfile,"%s",Clean(Stk[i]));
}
}
fprintf(Outfile,"%s\n",sziif(j,");","++;"));
break;
}
if(str_cmp(Lookup,"decr")==0)
{
j=FALSE;
fprintf(Outfile,"%s",Scoot);
for(i=2; i<=Ndx; i+=1)
{
if(str_cmp(Stk[i],",")==0)
{
fprintf(Outfile,"%s","-=(");
j=TRUE;
}
else
{
fprintf(Outfile,"%s",Clean(Stk[i]));
}
}
fprintf(Outfile,"%s\n",sziif(j,");","--;"));
break;
}
if(str_cmp(Lookup,"seek")==0)
{
if(DataType(Stk[2])==vt_NUMBER)
{
strcpy(Stk[2], join(2,"FP",Stk[2]));
}
if(CheckLocal(Stk[2], &i)==vt_UNKNOWN)
{
AddGlobal(Stk[2],vt_FILEPTR,0,"",0,0,0,0);
}
fprintf(Outfile,"%s%s",Scoot,"fseek(");
for(Tmp=2; Tmp<=Ndx; Tmp+=1)
{
fprintf(Outfile,"%s",Clean(Stk[Tmp]));
}
fprintf(Outfile,"%s\n",",0);");
break;
}
if(str_cmp(Lookup,"select")==0)
{
*CaseVar=0;
CaseFlag=0;
for(A=3; A<=Ndx; A+=1)
{
strcat(CaseVar,Stk[A]);
}
Push(CaseVar);
fprintf(Outfile,"%s%s\n",Scoot,"for(;;)");
fprintf(Outfile,"%s%s\n",Scoot,"{");
BumpUp();
break;
}
if(str_cmp(Lookup,"~get")==0)
{
Use_Get=TRUE;
if(DataType(Stk[2])==vt_NUMBER)
{
strcpy(Stk[2], join(2,"FP",Stk[2]));
}
if(CheckLocal(Stk[2], &i)==vt_UNKNOWN)
{
if(CheckGlobal(Stk[2], &i)==vt_UNKNOWN)
{
AddGlobal(Stk[2],vt_FILEPTR,0,"",0,0,0,0);
}
}
fprintf(Outfile,"%s%s",Scoot,"GET(");
for(Tmp=2; Tmp<=Ndx; Tmp+=1)
{
fprintf(Outfile,"%s",Clean(Stk[Tmp]));
}
fprintf(Outfile,"%s\n",");");
break;
}
if(str_cmp(Lookup,"~put")==0)
{
Use_Put=TRUE;
if(DataType(Stk[2])==vt_NUMBER)
{
strcpy(Stk[2], join(2,"FP",Stk[2]));
}
if(CheckLocal(Stk[2], &i)==vt_UNKNOWN)
{
if(CheckGlobal(Stk[2], &i)==vt_UNKNOWN)
{
AddGlobal(Stk[2],vt_FILEPTR,0,"",0,0,0,0);
}
}
fprintf(Outfile,"%s%s",Scoot,"PUT(");
for(Tmp=2; Tmp<=Ndx; Tmp+=1)
{
fprintf(Outfile,"%s",Clean(Stk[Tmp]));
}
fprintf(Outfile,"%s\n",");");
break;
}
if(str_cmp(Lookup,"gosub")==0)
{
Use_Gosub=TRUE;
fprintf(Outfile,"%s%s",Scoot,"if (setjmp(GosubStack[GosubNdx++])==0)");
fprintf(Outfile,"%s%s%s\n"," goto ",ucase(Stk[2]),";");
break;
}
if(str_cmp(Lookup,"return")==0)
{
Use_Gosub=TRUE;
fprintf(Outfile,"%s%s\n",Scoot,"longjmp (GosubStack [--GosubNdx],1 );");
fprintf(Outfile,"%s\n","");
break;
}
if(str_cmp(Lookup,"data")==0)
{
if(str_cmp(Stk[Ndx],",")!=0)
{
strcpy(Stk[Ndx+1],",");
Ndx++;
}
for(A=2; A<=Ndx; A+=1)
{
if(inchr(Stk[A],DQ)==0&&str_cmp(Stk[A],",")!=0)
{
strcpy(Stk[A],enc(Stk[A]));
}
fprintf(FP5,"%s",Stk[A]);
}
fprintf(FP5,"%s\n","");
break;
}
if(str_cmp(Lookup,"namespace")==0)
{
UseCpp=TRUE;
strcpy(szTmp,mid(Src,inchr(Src," ")+1));
fprintf(Outfile,"%s%s\n","namespace ",ltrim(szTmp));
fprintf(Outfile,"%s\n","{");
InNameSpace++;
BumpUp();
break;
}
if(str_cmp(Lookup,"endnamespace")==0)
{
InNameSpace--;
BumpDown();
fprintf(Outfile,"%s%s\n",Scoot,"}");
break;
}
if(str_cmp(Lookup,"class")==0)
{
if(InTypeDef==0)
{
SaveOutfileNum=Outfile;
}
Outfile=FP4;
InTypeDef++;
strcpy(TypeName[InTypeDef],Stk[2]);
if(str_cmp(Stk[3],"inherits")==0)
{
strcpy(Stk[3], join(2,": public ",Stk[4]));
}
AddTypeDefs(TypeName[InTypeDef],vt_STRUCT);
BaseTypeDefsCnt[InTypeDef]=TypeDefsCnt;
if(InTypeDef==1)
{
fprintf(Outfile,"%s\n","");
fprintf(Outfile,"%s%s%s%s\n","class ",TypeName[InTypeDef],Stk[3]," {");
BumpUp();
}
break;
}
if(str_cmp(Lookup,"endclass")==0)
{
BumpDown();
fprintf(Outfile,"%s%s\n","};",LF);
InTypeDef--;
break;
}
if(str_cmp(Lookup,"type")==0)
{
if(InTypeDef==0)
{
SaveOutfileNum=Outfile;
}
Outfile=FP4;
if(Ndx>2)
{
if(InTypeDef)
{
Abort("Single line TYPE within type/union not supported");
}
for(i=Ndx; i>=1; i+=-1)
{
if(iMatchWrd(Stk[i],"as"))
{
break;
}
}
if(!iMatchWrd(Stk[i],"as"))
{
Abort("Missing AS TYPE");
}
fprintf(Outfile,"%s","typedef ");
j=i-1;
i++;
while(i<=Ndx)
{
fprintf(Outfile,"%s%s",Stk[i]," ");
i++;
}
for(i=2; i<=j; i+=1)
{
fprintf(Outfile,"%s",Stk[i]);
}
fprintf(Outfile,"%s\n",";");
Outfile=SaveOutfileNum;
}
else
{
InTypeDef++;
strcpy(TypeName[InTypeDef],Stk[2]);
AddTypeDefs(TypeName[InTypeDef],vt_STRUCT);
BaseTypeDefsCnt[InTypeDef]=TypeDefsCnt;
if(InTypeDef==1)
{
fprintf(Outfile,"%s\n","");
fprintf(Outfile,"%s%s\n","typedef struct _",TypeName[InTypeDef]);
fprintf(Outfile,"%s\n","{");
BumpUp();
}
else
{
fprintf(Outfile,"%s%s\n",Scoot,"struct");
fprintf(Outfile,"%s%s\n",Scoot,"{");
AddTypedefElement(BaseTypeDefsCnt[InTypeDef-1],vt_STRUCT,TypeName[InTypeDef],TypeName[InTypeDef],0);
BumpUp();
}
}
break;
}
if(str_cmp(Lookup,"endtype")==0)
{
if(InTypeDef==1)
{
BumpDown();
fprintf(Outfile,"%s%s%s%s%s%s\n","}",TypeName[InTypeDef],", *","LP",ucase(TypeName[InTypeDef]),";");
fprintf(Outfile,"%s\n","");
Outfile=SaveOutfileNum;
fprintf(FP6,"%s%s%s%s%s%s\n",Scoot,"#define ",ucase(TypeName[InTypeDef]),"_CLASS struct _",ucase(TypeName[InTypeDef]),"*");
}
else
{
BumpDown();
fprintf(Outfile,"%s%s%s%s\n",Scoot,"} ",TypeName[InTypeDef],";");
fprintf(Outfile,"%s\n","");
}
InTypeDef--;
break;
}
if(str_cmp(Lookup,"union")==0)
{
if(InTypeDef==0)
{
SaveOutfileNum=Outfile;
}
Outfile=FP4;
InTypeDef++;
strcpy(TypeName[InTypeDef],Stk[2]);
AddTypeDefs(TypeName[InTypeDef],vt_UNION);
BaseTypeDefsCnt[InTypeDef]=TypeDefsCnt;
if(InTypeDef==1)
{
fprintf(Outfile,"%s\n","");
fprintf(Outfile,"%s\n","typedef union ");
fprintf(Outfile,"%s\n","{");
BumpUp();
}
else
{
fprintf(Outfile,"%s%s\n",Scoot,"union");
fprintf(Outfile,"%s%s\n",Scoot,"{");
AddTypedefElement(BaseTypeDefsCnt[InTypeDef-1],vt_UNION,TypeName[InTypeDef],TypeName[InTypeDef],0);
BumpUp();
}
break;
}
if(str_cmp(Lookup,"endunion")==0)
{
if(InTypeDef==1)
{
BumpDown();
fprintf(Outfile,"%s%s%s%s%s%s\n","} ",TypeName[InTypeDef],", *","LP",ucase(TypeName[InTypeDef]),";");
fprintf(Outfile,"%s\n","");
Outfile=SaveOutfileNum;
}
else
{
BumpDown();
fprintf(Outfile,"%s%s%s%s\n",Scoot,"} ",TypeName[InTypeDef],";");
fprintf(Outfile,"%s\n","");
}
InTypeDef--;
break;
}
if(str_cmp(Lookup,"with")==0)
{
WithCnt++;
if(WithCnt==8)
{
Abort("[With] depth exceeded");
}
*WithVar[WithCnt]=0;
for(i=2; i<=Ndx; i+=1)
{
strcat(WithVar[WithCnt],Stk[i]);
}
break;
}
if(str_cmp(Lookup,"endwith")==0)
{
WithCnt--;
break;
}
if(str_cmp(Lookup,"clear")==0)
{
Use_Clear=TRUE;
fprintf(Outfile,"%s%s",Scoot,"Clear ");
if(str_cmp(Stk[2],"(")!=0)
{
fprintf(Outfile,"%s","(");
}
for(i=2; i<=Ndx; i+=1)
{
fprintf(Outfile,"%s",Clean(Stk[i]));
}
if(str_cmp(Stk[2],"(")!=0)
{
fprintf(Outfile,"%s",")");
}
fprintf(Outfile,"%s\n",";");
break;
}
if(str_cmp(Lookup,"repeat")==0)
{
*lszTmp=0;
for(i=2; i<=Ndx; i+=1)
{
strcat(lszTmp,Stk[i]);
}
strcpy(lszTmp,Clean(lszTmp));
BumpUp();
if(inchr(Stk[2],"-"))
{
if(str_cmp(left(lszTmp,1),"-")==0)
{
strcpy(lszTmp,mid(lszTmp,2));
}
fprintf(Outfile,"%s%s\n",Scoot,"{int BCX_REPEAT;");
fprintf(Outfile,"%s%s%s%s\n",Scoot,"for(BCX_REPEAT=",lszTmp,";BCX_REPEAT>=1;BCX_REPEAT--)");
fprintf(Outfile,"%s%s\n",Scoot,"{");
}
else
{
fprintf(Outfile,"%s%s\n",Scoot,"{int BCX_REPEAT;");
fprintf(Outfile,"%s%s%s%s\n",Scoot,"for(BCX_REPEAT=1;BCX_REPEAT<=",lszTmp,";BCX_REPEAT++)");
fprintf(Outfile,"%s%s\n",Scoot,"{");
}
BumpUp();
break;
}
if(str_cmp(Lookup,"endrepeat")==0)
{
BumpDown();
fprintf(Outfile,"%s%s\n",Scoot,"}");
fprintf(Outfile,"%s%s\n",Scoot,"}");
BumpDown();
break;
}
if(str_cmp(Lookup,"const")==0)
{
char Buffer[2048];
char Sep[2048];
*Buffer=0;
*Sep=0;
*Stk[1]=0;
for(i=2; i<=Ndx; i+=1)
{
if(str_cmp(Stk[i],"=")==0)
{
i++;
break;
}
else
{
strcat(Stk[1],Stk[i]);
}
}
strcpy(Stk[1], join(3,"#define ",Clean(Stk[1]),SPC));
for(i=i; i<=Ndx; i+=1)
{
if(isalpha(Stk[i][0])||(Stk[i][0]==95&&isalpha(Stk[i+1][0]))||Stk[i+1][0]==95)
{
strcpy(Sep," ");
}
else
{
*Sep=0;
}
if(!IsQuoted(Stk[i]))
{
strcpy(Stk[i],RemoveStr(Stk[i],"$"));
}
strcpy(Buffer, join(3,Buffer,Stk[i],Sep));
}
strcpy(Buffer, join(2,Stk[1],Buffer));
if(InConditional)
{
if(InFunc)
{
fprintf(Outfile,"%s\n",Buffer);
}
else
{
if(str_cmp(ConstLastDef,"FP6")!=0)
{
fprintf(FP6,"%s%s\n",InIfDef,"// FP6");
strcpy(ConstLastDef,"FP6");
}
fprintf(FP6,"%s\n",Buffer);
}
}
else
{
fprintf(FP6,"%s\n",Buffer);
}
break;
}
if(str_cmp(Lookup,"kill")==0)
{
fprintf(Outfile,"%s%s",Scoot,"remove (");
for(A=2; A<=Ndx; A+=1)
{
fprintf(Outfile,"%s",Clean(trim(Stk[A])));
}
fprintf(Outfile,"%s\n",");");
break;
}
if(str_cmp(Lookup,"chdir")==0 || str_cmp(Lookup,"_chdir")==0 || str_cmp(Lookup,"rmdir")==0 || str_cmp(Lookup,"_rmdir")==0 || str_cmp(Lookup,"mkdir")==0 || str_cmp(Lookup,"_mkdir")==0)
{
fprintf(Outfile,"%s%s%s",Scoot,Lookup," (");
for(A=2; A<=Ndx; A+=1)
{
fprintf(Outfile,"%s",Clean(trim(Stk[A])));
}
fprintf(Outfile,"%s\n",");");
break;
}
if(str_cmp(Lookup,"free")==0)
{
VarInfo* VI;
A=2;
if(iMatchWrd(Stk[2],"dynamic"))
{
A=3;
}
if(str_cmp(Stk[A],"(")==0)
{
A++;
Ndx--;
}
strcpy(CVar,Clean(Stk[A]));
vt=CheckLocal(CVar, &id);
if(vt==vt_UNKNOWN)
{
vt=CheckGlobal(CVar, &id);
if(vt==vt_UNKNOWN)
{
Abort(join(3,"Can not REDIM ",CVar," not previously dimensioned"));
}
VI= &GlobalVars[id];
}
else
{
VI= &LocalVars[id];
Warning("Local dynamic variables are automatically freed.",1);
}
*CVar=0;
for(i=A; i<=Ndx; i+=1)
{
strcat(CVar,Stk[i]);
}
strcpy(CVar,Clean(CVar));
if(vt==vt_STRUCT||vt==vt_UNION)
{
GetElement(2, &vt, &dms,VI->VarDef);
if(vt!=vt_UNKNOWN&&dms>0)
{
Use_DynamicA=TRUE;
fprintf(Outfile,"%s%s%s",Scoot,"if (",CVar);
fprintf(Outfile,"%s%s%s%d%s",") { DestroyArr((void **)",CVar,",",(int)dms,", 1); ");
fprintf(Outfile,"%s%s\n",CVar,"=NULL; }");
break;
}
}
if(VI->VarPntr>1)
{
Use_DynamicA=TRUE;
fprintf(Outfile,"%s%s%s",Scoot,"if (",CVar);
fprintf(Outfile,"%s%s%s%s%s",") { DestroyArr((void **)",CVar,",",str(VI->VarPntr),", 1); ");
fprintf(Outfile,"%s%s\n",CVar,"=NULL; }");
}
else
{
fprintf(Outfile,"%s%s%s%s%s%s\n",Scoot,"free(",CVar,"), ",CVar,"=NULL;");
}
break;
}
if(str_cmp(Lookup,"midstr")==0)
{
*Src=0;
for(A=1; A<=Ndx; A+=1)
{
strcat(Src,Clean(Stk[A]));
}
fprintf(Outfile,"%s%s%s\n",Scoot,trim(Src),";");
break;
}
if(str_cmp(Lookup,"swap")==0)
{
VarInfo* VI1;
VarInfo* VI2;
int indx;
fprintf(Outfile,"%s%s",Scoot,"swap ((BYTE*)&");
for(i=2; i<=Ndx; i+=1)
{
if(str_cmp(Stk[i],",")==0)
{
break;
}
fprintf(Outfile,"%s",Clean(Stk[i]));
}
A=CheckLocal(Stk[2], &indx);
if(A==vt_UNKNOWN)
{
A=CheckGlobal(Stk[2], &indx);
if(A==vt_UNKNOWN)
{
Abort(join(3,"Variable '",Stk[2],"' in swap statement unknown"));
}
VI1= &GlobalVars[indx];
}
else
{
VI1= &LocalVars[indx];
}
if(str_cmp(right(Stk[i-1],1),"]")!=0)
{
if(VI1->VarType==vt_CHAR&&VI1->VarPntr==1)
{
fprintf(Outfile,"%s","[0]");
}
}
fprintf(Outfile,"%s",",(BYTE*)&");
i++;
for(j=i; j<=Ndx; j+=1)
{
fprintf(Outfile,"%s",Clean(Stk[j]));
}
A=CheckLocal(Stk[i], &indx);
if(A==vt_UNKNOWN)
{
A=CheckGlobal(Stk[i], &indx);
if(A==vt_UNKNOWN)
{
Abort(join(3,"Variable '",Stk[i],"' in swap statement unknown"));
}
VI2= &GlobalVars[indx];
}
else
{
VI2= &LocalVars[indx];
}
if(str_cmp(right(Stk[j-1],1),"]")!=0)
{
if(VI2->VarType==vt_CHAR&&VI2->VarPntr==1)
{
fprintf(Outfile,"%s","[0]");
}
}
if(VI1->VarType!=VI2->VarType)
{
Warning("Possible size error in swap statement");
}
if(VI2->VarType==vt_STRVAR||VI2->VarType==vt_CHAR)
{
fprintf(Outfile,"%s",",strlen(");
}
else
{
fprintf(Outfile,"%s",",sizeof(");
}
for(j=i; j<=Ndx; j+=1)
{
fprintf(Outfile,"%s",Clean(Stk[j]));
}
fprintf(Outfile,"%s\n","));");
break;
}
if(str_cmp(Lookup,"rename")==0)
{
fprintf(Outfile,"%s%s",Scoot,"rename (");
for(A=2; A<=Ndx; A+=1)
{
fprintf(Outfile,"%s",Clean(trim(Stk[A])));
}
fprintf(Outfile,"%s\n",");");
break;
}
if(str_cmp(Lookup,"copyfile")==0)
{
fprintf(Outfile,"%s%s",Scoot,"CopyFile ");
if(str_cmp(Stk[2],"(")!=0)
{
fprintf(Outfile,"%s","(");
}
for(A=2; A<=Ndx; A+=1)
{
fprintf(Outfile,"%s",Clean(trim(Stk[A])));
}
if(str_cmp(Stk[Ndx],")")!=0)
{
fprintf(Outfile,"%s\n",");");
}
else
{
fprintf(Outfile,"%s\n",";");
}
break;
}
if(str_cmp(Lookup,"shell")==0)
{
if(Ndx>2)
{
for(A=3; A<=Ndx; A+=1)
{
strcpy(Stk[2], join(2,Stk[2],Stk[A]));
}
}
strcpy(ZZ,Stk[2]);
if(ZZ[0]==0)
{
strcpy(ZZ,DDQ);
}
fprintf(Outfile,"%s%s%s%s\n",Scoot,"Shell(",Clean(ZZ),");");
break;
}
if(str_cmp(Lookup,"lineinput")==0)
{
i=DataType(Stk[2]);
if(i==vt_STRLIT||i==vt_STRVAR)
{
if(i!=vt_STRLIT)
{
strcpy(Stk[2],Clean(Stk[2]));
}
fprintf(Outfile,"%s%s%s%s%s%s\n",Scoot,"printf(",enc("%s"),",",Stk[2],");");
fprintf(Outfile,"%s%s%s%s\n",Scoot,"AR_fgets_retval=fgets(",Clean(Stk[3]),",65535,stdin);");
fprintf(Outfile,"%s%s%s%s%s\n",Scoot,Clean(Stk[3]),"[strlen(",Clean(Stk[3]),")-1]=0;");
break;
}
strcpy(Stk[2],RemoveStr(Stk[2],"#"));
if(DataType(Stk[2])==vt_NUMBER)
{
strcpy(Stk[2], join(2,"FP",Stk[2]));
}
strcpy(Handl,extract(Stk[2],"["));
if(CheckLocal(Handl, &i)==vt_UNKNOWN)
{
if(CheckGlobal(Handl, &i)==vt_UNKNOWN)
{
AddGlobal(Handl,vt_FILEPTR,0,"",0,0,0,0);
}
}
strcpy(Var,Clean(Stk[3]));
*Var1=0;
strcpy(CVar,Var);
if(inchr(Var,"[")&&inchr(Var,"]"))
{
if(instr_b(Var,"[++"))
{
strcpy(CVar,replace(CVar,"++",""));
}
if(instr_b(Var,"[--"))
{
strcpy(CVar,replace(CVar,"--",""));
}
if(instr_b(Var,"++]"))
{
strcpy(CVar,replace(CVar,"++",""));
strcpy(Var1,mid(Var,inchr(Var,"[")+1));
strcpy(Var1,extract(Var1,"]"));
strcpy(Var,CVar);
}
if(instr_b(Var,"--]"))
{
strcpy(CVar,replace(CVar,"--",""));
strcpy(Var1,mid(Var,inchr(Var,"[")+1));
strcpy(Var1,extract(Var1,"]"));
strcpy(Var,CVar);
}
}
fprintf(Outfile,"%s%s%s\n",Scoot,Var,"[0]=0;");
fprintf(Outfile,"%s%s%s%s%s%s\n",Scoot,"AR_fgets_retval=fgets(",Var,",65535,",Clean(Stk[2]),");");
fprintf(Outfile,"%s%s%s%s%s%s",Scoot,"if(",CVar,"[strlen(",CVar,")-1]==10)");
fprintf(Outfile,"%s%s%s%s\n",CVar,"[strlen(",CVar,")-1]=0;");
if(Var1[0]!=0)
{
fprintf(Outfile,"%s%s\n",Var1,";");
}
break;
}
if(str_cmp(Lookup,"open")==0)
{
for(A=1; A<=Ndx; A+=1)
{
strcpy(Keyword,lcase(Stk[A]));
for(;;)
{
if(str_cmp(Keyword,"open")==0)
{
*Stk[A]=0;
break;
}
if(str_cmp(Keyword,"for")==0)
{
*Stk[A]=0;
*Filnam=0;
for(j=2; j<=A-1; j+=1)
{
strcat(Filnam,Stk[j]);
}
strcpy(Filnam,Clean(Filnam));
break;
}
if(str_cmp(Keyword,"as")==0)
{
*Stk[A]=0;
if(DataType(Stk[A+1])==vt_NUMBER)
{
strcpy(Stk[A+1], join(2,"FP",Stk[A+1]));
}
if(CheckLocal(Stk[A+1], &i)==vt_UNKNOWN)
{
if(CheckGlobal(Stk[A+1], &i)==vt_UNKNOWN)
{
AddGlobal(Stk[A+1],vt_FILEPTR,0,"",0,0,0,0);
}
}
*Var=0;
for(j=A+1; j<=Ndx; j+=1)
{
if(iMatchWrd(Stk[j],"reclen"))
{
break;
}
strcat(Var,Stk[j]);
*Stk[j]=0;
}
strcpy(Handl, join(2,Var,"@"));
break;
}
if(str_cmp(Keyword,"network")==0)
{
Use_Socket=TRUE;
break;
}
if(str_cmp(Keyword,"input")==0)
{
strcpy(Op,enc("r"));
*Stk[A]=0;
break;
}
if(str_cmp(Keyword,"output")==0)
{
strcpy(Op,enc("w"));
*Stk[A]=0;
break;
}
if(str_cmp(Keyword,"append")==0)
{
strcpy(Op,enc("a"));
*Stk[A]=0;
break;
}
if(str_cmp(Keyword,"binary")==0)
{
strcpy(Op,enc("rb+"));
*Stk[A]=0;
break;
}
if(str_cmp(Keyword,"binaryappend")==0)
{
strcpy(Op,enc("ab+"));
*Stk[A]=0;
break;
}
if(str_cmp(Keyword,"binarynew")==0)
{
strcpy(Op,enc("wb+"));
*Stk[A]=0;
break;
}
if(str_cmp(Keyword,"binaryinput")==0)
{
strcpy(Op,enc("rb"));
*Stk[A]=0;
break;
}
if(str_cmp(Keyword,"binaryoutput")==0)
{
strcpy(Op,enc("rb+"));
*Stk[A]=0;
break;
}
if(str_cmp(Keyword,"reclen")==0)
{
if(str_cmp(Stk[A+1],"=")==0)
{
for(j=A+2; j<=Ndx; j+=1)
{
strcpy(Stk[j-1],Stk[j]);
}
Ndx--;
}
strcpy(Var, join(2,extract(Clean(Handl),"["),"len"));
if(CheckLocal(Var, &i)==vt_UNKNOWN)
{
AddGlobal(Var,vt_INTEGER,0,"",0,0,0,0);
}
else
{
if(CheckLocal(Var, &i)==vt_UNKNOWN)
{
AddLocal(Var,vt_INTEGER,0,"",0,0,0);
strcpy(Var, join(2,"int ",Var));
}
}
i=CheckType(Stk[A+1]);
strcpy(ZZ,lcase(Stk[A+1]));
if(i==vt_STRUCT||i==vt_UNION||str_cmp(ZZ,"int")==0 || str_cmp(ZZ,"double")==0 || str_cmp(ZZ,"float")==0)
{
fprintf(Outfile,"%s%s%s%s%s\n",Scoot,Var," = sizeof(",Stk[A+1],");");
}
else
{
fprintf(Outfile,"%s%s%s%s%s\n",Scoot,Var," = ",Clean(Stk[A+1]),";");
}
*Stk[A]=0;
*Stk[A+1]=0;
}
break;
}
}
fprintf(Outfile,"%s%s%s%s%s%s%s%s\n",Scoot,"if((",Clean(Handl),"=fopen(",Filnam,",",Op,"))==0)");
fprintf(Outfile,"%s%s\n",Scoot," {");
strcpy(lszTmp,enc("Can't open file %s\\n"));
fprintf(Outfile,"%s%s%s%s%s%s\n",Scoot," fprintf(stderr,",lszTmp,",",Filnam,");");
fprintf(Outfile,"%s%s\n",Scoot," exit(1);");
fprintf(Outfile,"%s%s\n",Scoot," }");
break;
}
if(str_cmp(Lookup,"record")==0)
{
static struct _functionParse ffp;
memset(&ffp,0,sizeof(ffp));
int numargs=0;
if(DataType(Stk[2])==vt_NUMBER)
{
strcpy(Stk[2], join(2,"FP",Stk[2]));
}
if(Ndx>1)
{
numargs=SepFuncArgs(1, &ffp,FALSE);
}
if(numargs<1)
{
Abort("Missing required arguments to RECORD");
}
if(numargs>4)
{
Abort("Too many arguments to RECORD");
}
if(numargs==3)
{
fprintf(Outfile,"%s%s%s%s%s%s%s%s%s%s\n",Scoot,"fseek(",GetArg(1, &ffp),", (",GetArg(2, &ffp)," - 1) * ",Stk[2],"len + ",GetArg(3, &ffp),", SEEK_SET);");
}
else if(numargs==2)
{
fprintf(Outfile,"%s%s%s%s%s%s%s%s\n",Scoot,"fseek(",GetArg(1, &ffp),", (",GetArg(2, &ffp)," - 1) * ",Stk[2],"len, SEEK_SET);");
}
else
{
fprintf(Outfile,"%s%s%s%s\n",Scoot,"fseek(",GetArg(1, &ffp),", 0, SEEK_SET);");
}
break;
}
if(str_cmp(Lookup,"fwrite")==0)
{
if(DataType(Stk[2])==vt_NUMBER)
{
strcpy(Stk[2], join(2,"FP",Stk[Ndx]));
}
if(CheckLocal(Stk[2], &i)==vt_UNKNOWN)
{
AddGlobal(Stk[2],vt_FILEPTR,0,"",0,0,0,0);
}
*Handl=0;
for(j=2; j<=Ndx; j+=1)
{
if(iMatchWrd(Stk[j],",")||iMatchWrd(Stk[j],";"))
{
*Stk[j]=0;
break;
}
strcat(Handl,Stk[j]);
*Stk[j]=0;
}
strcat(Handl,"@");
strcpy(ZZ, join(2,"f",PrintWriteFormat(1)));
strcpy(ZZ, join(4,left(ZZ,8),Clean(Handl),",",mid(ZZ,9)));
fprintf(Outfile,"%s%s\n",Scoot,ZZ);
break;
}
if(str_cmp(Lookup,"close")==0)
{
if(Ndx==1)
{
fprintf(Outfile,"%s%s\n",Scoot,"fcloseall();");
break;
}
if(DataType(Stk[2])==vt_NUMBER)
{
strcpy(Stk[2], join(2,"FP",Stk[Ndx]));
}
if(CheckLocal(Stk[2], &i)==vt_UNKNOWN)
{
if(CheckGlobal(Stk[2], &i)==vt_UNKNOWN)
{
AddGlobal(Stk[2],vt_FILEPTR,0,"",0,0,0,0);
}
}
*Handl=0;
for(j=2; j<=Ndx; j+=1)
{
strcat(Handl,Stk[j]);
}
fprintf(Outfile,"%s%s%s%s\n",Scoot,"if(",Handl,")");
fprintf(Outfile,"%s%s\n",Scoot," {");
fprintf(Outfile,"%s%s%s%s\n",Scoot," fclose(",Handl,");");
fprintf(Outfile,"%s%s%s%s\n",Scoot," ",Handl,"=NULL;");
fprintf(Outfile,"%s%s\n",Scoot," }");
break;
}
if(str_cmp(Lookup,"call")==0)
{
*lszTmp=0;
for(Tmp=2; Tmp<=Ndx; Tmp+=1)
{
strcat(lszTmp,Clean(Stk[Tmp]));
}
if(!iMatchRgt(lszTmp,")"))
{
strcat(lszTmp,"()");
}
strcat(lszTmp,";");
fprintf(Outfile,"%s%s\n",Scoot,lszTmp);
break;
}
if(str_cmp(Lookup,"declare")==0)
{
static struct _functionParse FP;
memset(&FP,0,sizeof(FP));
char TempProto[2048];
FuncSubDecs1("sub");
SepFuncArgs(3, &FP,TRUE);
strcpy(TempProto,MakeDecProto( &FP));
if(!NoTypeDeclare)
{
fprintf(FP4,"%s%s\n",TempProto,";");
}
else
{
ProtoCnt++;
strcpy(ProtoType[ProtoCnt].Prototype, join(2,TempProto,";"));
}
break;
}
if(str_cmp(Lookup,"function")==0 || str_cmp(Lookup,"sub")==0 || str_cmp(Lookup,"constructor")==0 || str_cmp(Lookup,"destructor")==0)
{
static char CTOR_USE[2048];
memset(&CTOR_USE,0,sizeof(CTOR_USE));
static char CTOR_SRC[2048];
memset(&CTOR_SRC,0,sizeof(CTOR_SRC));
static int New_Ndx;
memset(&New_Ndx,0,sizeof(New_Ndx));
if(str_cmp(Stk[2],"main")==0)
{
strcpy(Stk[1],"function");
strcpy(Stk[2],"main%");
ForceMainToFunc=TRUE;
}
if(iMatchWrd(Stk[1],"constructor")||iMatchWrd(Stk[1],"destructor"))
{
strcpy(Stk[1],"sub");
{int ct;
for(ct=1; ct<=Ndx; ct+=1)
{
if(str_cmp(Stk[ct],"using")==0)
{
New_Ndx=ct-1;
{int ut;
for(ut=ct; ut<=Ndx; ut+=1)
{
strcat(CTOR_USE,Stk[ut]);
}
}
}
}
}
if(strlen(CTOR_USE))
{
strcpy(CTOR_USE,iReplace(CTOR_USE,"using",":"));
Ndx=New_Ndx;
}
Use_Ctor=TRUE;
}
FuncSubDecs1("sub");
IsStdFunc=FALSE;
if(iMatchWrd(Stk[Ndx],"stdcall"))
{
strcpy(CallType,"__attribute__((stdcall)) ");
Ndx--;
IsStdFunc=TRUE;
}
InFunc=TRUE;
InMain=FALSE;
LocalVarCnt=0;
if(InNameSpace)
{
Outfile=FP2;
}
else
{
Outfile=FP3;
}
FuncSubDecs2("sub",mt_FuncSubDecC_Dec);
strcpy(VarCode.Functype,ltrim(VarCode.Functype));
strcpy(Funcname,Clean(Stk[2]));
if(IsExported||IsStdFunc)
{
strcpy(Funcname, join(2,CallType,Funcname));
}
VarCode.Method=mt_FuncSubDecC_Dec2;
A=3;
while(A<=Ndx)
{
if(str_cmp(Stk[A+1],"(")==0)
{
for(k=A+2; k<=Ndx; k+=1)
{
if(str_cmp(Stk[k],")")==0)
{
break;
}
}
if(iMatchWrd(Stk[k+2],"sub"))
{
j=vt_VOID;
strcpy(VarCode.AsToken,"void");
}
else if(iMatchWrd(Stk[k+2],"function"))
{
GetTypeInfo(Stk[k+3], &IsPointer, &i, &j);
strcpy(VarCode.AsToken,Stk[k+3]);
}
strcpy(VarCode.Token,Stk[A]);
VarCode.VarNo=j;
VarCode.IsPtrFlag=1;
VarCode.Method=mt_FuncSubx1;
GetVarCode( &VarCode);
strcpy(Var,Clean(Stk[A]));
*lszTmp=0;
A+=2;
while(A<=k)
{
if(iMatchWrd(Stk[A+1],"as")&&A<k)
{
Tmp=A+2;
while(str_cmp(Stk[Tmp],",")!=0 && str_cmp(Stk[Tmp],")")!=0)
{
GetTypeInfo(Stk[Tmp], &IsPointer, &i, &j);
AddLocal(Stk[A],j,i,"",IsPointer,0,0);
strcpy(VarCode.Token,Stk[A]);
strcpy(VarCode.AsToken,Stk[Tmp]);
VarCode.VarNo=j;
VarCode.IsPtrFlag=1;
VarCode.Method=mt_FuncSubx2;
GetVarCode( &VarCode);
Tmp++;
if(str_cmp(Stk[Tmp],",")==0)
{
strcat(VarCode.Proto,",");
strcat(VarCode.Header,",");
}
}
A=Tmp;
}
else
{
if(str_cmp(Stk[A],",")!=0 && str_cmp(Stk[A],")")!=0)
{
IsPointer=tally((Stk[A]),"*");
strcpy(Var,RemoveStr(Stk[A],"*"));
j=DataType(Var);
if(j!=vt_UNKNOWN&&InFunc==TRUE&&Var[0])
{
AddLocal(Clean(Var),j,0,"",IsPointer,0,0);
}
strcpy(VarCode.Token,Stk[A]);
*VarCode.AsToken=0;
VarCode.VarNo=j;
VarCode.IsPtrFlag=IsPointer;
VarCode.Method=mt_FuncSubDecC_Dec2;
GetVarCode( &VarCode);
}
}
A++;
}
A=k+3;
if(VarCode.Method==mt_FuncSubDecC_Dec2)
{
midstr(VarCode.Proto,strlen(VarCode.Proto)-1,1,")");
midstr(VarCode.Header,strlen(VarCode.Header)-1,1,")");
}
else
{
strcat(VarCode.Proto,")");
strcat(VarCode.Header,")");
}
VarCode.Method=mt_FuncSubDecC_Dec2;
}
else
{
if(iMatchWrd(Stk[A+1],"as"))
{
GetTypeInfo(Stk[A+2], &IsPointer, &i, &j);
strcpy(Var,Clean(Stk[A]));
AddLocal(Var,j,i,"",IsPointer,0,0);
strcpy(VarCode.Token,Stk[A]);
strcpy(VarCode.AsToken,Stk[A+2]);
VarCode.VarNo=j;
VarCode.IsPtrFlag=IsPointer;
GetVarCode( &VarCode);
*Stk[A+1]=0;
*Stk[A+2]=0;
A+=2;
}
else
{
if(inchr("=",Stk[A])&&str_cmp(Stk[A],"")!=0)
{
Abort("Illegal optional parameter found");
}
if(!inchr(",().",Stk[A])&&str_cmp(Stk[A],"")!=0)
{
IsPointer=tally((Stk[A]),"*");
strcpy(Var,RemoveStr(Stk[A],"*"));
j=DataType(Var);
if(j!=vt_UNKNOWN&&Var[0])
{
AddLocal(Clean(Var),j,0,"",IsPointer,0,0);
}
strcpy(VarCode.Token,Stk[A]);
*VarCode.AsToken=0;
VarCode.VarNo=j;
VarCode.IsPtrFlag=IsPointer;
GetVarCode( &VarCode);
}
}
}
A++;
}
VarCode.Method=2;
strcpy(VarCode.Token,Funcname);
FuncSubDecs3( &VarCode);
if(iMatchLft(VarCode.Header,"main("))
{
strcpy(VarCode.Header,"int main(int argc, char *argv[])");
strcpy(VarCode.Proto,"int main(int argc, char *argv[]);");
CurrentFuncType=vt_INTEGER;
}
if(Use_Static)
{
strcpy(VarCode.Header, join(2,"static ",VarCode.Header));
strcpy(VarCode.Proto, join(2,"static ",VarCode.Proto));
}
if(!InNameSpace)
{
ProtoCnt++;
strcpy(ProtoType[ProtoCnt].Prototype,VarCode.Proto);
}
if(str_cmp(InIfDef,"FP3")==0)
{
if(ProtoCnt>1)
{
strcpy(ProtoType[ProtoCnt].Condition,ProtoType[ProtoCnt-1].Condition);
}
else
{
*ProtoType[ProtoCnt].Condition=0;
}
}
else
{
strcpy(ProtoType[ProtoCnt].Condition,InIfDef);
}
ProtoType[ProtoCnt].CondLevel=InConditional;
if(*InIfDef)
{
if(str_cmp(InIfDef,"FP3")!=0)
{
fprintf(Outfile,"%s\n",InIfDef);
printf("%s\n",InIfDef);
}
}
if(Use_Ctor)
{
strcpy(VarCode.Header,replace(VarCode.Header,"void ",""));
strcpy(VarCode.Header,replace(VarCode.Header,"void",""));
if(strlen(CTOR_USE))
{
fprintf(Outfile,"%s\n",VarCode.Header);
fprintf(Outfile,"%s%s\n",Scoot,CTOR_USE);
}
else
{
fprintf(Outfile,"%s\n",VarCode.Header);
}
Use_Ctor=FALSE;
}
else if(InNameSpace)
{
char szCPP_SF1[2048];
*szCPP_SF1=0;
if(iMatchLft(Lookup,"public"))
{
strcpy(szCPP_SF1,"public: virtual ");
}
fprintf(Outfile,"%s%s%s\n",Scoot,szCPP_SF1,VarCode.Header);
}
else
{
fprintf(Outfile,"%s\n",VarCode.Header);
}
fprintf(Outfile,"%s%s\n",Scoot,"{");
BumpUp();
break;
}
if(str_cmp(Lookup,"optfunction")==0 || str_cmp(Lookup,"optsub")==0)
{
FuncSubDecs1("optsub");
InFunc=TRUE;
LocalVarCnt=0;
Outfile=FP3;
if(InNameSpace)
{
Outfile=FP2;
}
else
{
Outfile=FP3;
}
FuncSubDecs2("optsub",mt_Opts);
strcpy(Funcname,Clean(Stk[2]));
VarCode.Method=mt_Opts2;
A=4;
while(A<Ndx)
{
if(Stk[A][0]==0)
{
A++;
continue;
}
if(str_cmp(Stk[A],",")==0)
{
VarCode.Method=mt_Opts3;
strcpy(VarCode.Token,Stk[A]);
GetVarCode( &VarCode);
VarCode.Method=mt_Opts2;
}
else if(str_cmp(Stk[A],"=")==0)
{
VarCode.Method=mt_Opts3;
if(str_cmp(Stk[A+1],"-")==0)
{
strcpy(VarCode.Token, join(3,Stk[A],Stk[A+1],Stk[A+2]));
*Stk[A+1]=0;
*Stk[A+2]=0;
A++;
}
else
{
strcpy(VarCode.Token, join(2,Stk[A],Stk[A+1]));
*Stk[A+1]=0;
}
if(iMatchWrd(Stk[A+2],"as"))
{
*Stk[A+2]=0;
*Stk[A+3]=0;
}
VarCode.VarNo=j;
VarCode.IsPtrFlag=IsPointer;
GetVarCode( &VarCode);
VarCode.Method=mt_Opts2;
}
else if(iMatchWrd(Stk[A+1],"as"))
{
GetTypeInfo(Stk[A+2], &IsPointer, &i, &j);
if(InFunc)
{
strcpy(Var,Clean(Stk[A]));
AddLocal(Var,j,i,"",IsPointer,0,0);
}
VarCode.VarNo=j;
strcpy(VarCode.Token,Stk[A]);
strcpy(VarCode.AsToken,Stk[A+2]);
VarCode.IsPtrFlag=IsPointer;
GetVarCode( &VarCode);
*Stk[A+1]=0;
*Stk[A+2]=0;
}
else
{
IsPointer=tally((Stk[A]),"*");
strcpy(Var,RemoveStr(Stk[A],"*"));
j=DataType(Var);
if(j!=vt_UNKNOWN)
{
AddLocal(Clean(Var),j,0,"",IsPointer,0,0);
}
VarCode.VarNo=j;
strcpy(VarCode.Token,Stk[A]);
*VarCode.AsToken=0;
VarCode.IsPtrFlag=IsPointer;
GetVarCode( &VarCode);
}
A++;
}
VarCode.Method=2;
strcpy(VarCode.Token,Funcname);
FuncSubDecs3( &VarCode);
if(Use_Static)
{
strcpy(VarCode.Header, join(2,"static ",VarCode.Header));
strcpy(VarCode.Proto, join(2,"static ",VarCode.Proto));
}
ProtoCnt++;
strcpy(ProtoType[ProtoCnt].Prototype,VarCode.Proto);
if(str_cmp(InIfDef,"FP3")==0)
{
*ProtoType[ProtoCnt].Condition=0;
}
else
{
strcpy(ProtoType[ProtoCnt].Condition,InIfDef);
}
ProtoType[ProtoCnt].CondLevel=InConditional;
fprintf(Outfile,"%s\n",VarCode.Header);
fprintf(Outfile,"%s%s\n",Scoot,"{");
BumpUp();
break;
}
if(str_cmp(Lookup,"overloadedfunction")==0 || str_cmp(Lookup,"overloadedsub")==0)
{
Use_Overloaded=TRUE;
FuncSubDecs1("overloadedsub");
InFunc=TRUE;
InMain=FALSE;
LocalVarCnt=0;
Outfile=FP8;
FuncSubDecs2("overloadedsub",mt_OverLoad);
strcpy(Funcname,Clean(Stk[2]));
strcpy(lszTmp, join(2," overloaded ",Funcname));
strcpy(Funcname,lszTmp);
VarCode.Method=mt_OverLoad2;
for(A=3; A<=Ndx; A+=1)
{
if(iMatchWrd(Stk[A+1],"as"))
{
GetTypeInfo(Stk[A+2], &IsPointer, &i, &j);
strcpy(Var,Clean(Stk[A]));
AddLocal(Var,j,i,"",IsPointer,0,0);
strcpy(VarCode.AsToken,Stk[A+2]);
*Stk[A+1]=0;
*Stk[A+2]=0;
}
else
{
strcpy(Var,RemoveStr(Stk[A],"*"));
j=DataType(Var);
if(!inchr(",().",Stk[A])&&str_cmp(Stk[A],"")!=0)
{
IsPointer=tally((Stk[A]),"*");
if(j!=vt_UNKNOWN&&InFunc==TRUE&&Var[0])
{
AddLocal(Clean(Var),j,0,"",IsPointer,0,0);
}
}
*VarCode.AsToken=0;
}
VarCode.VarNo=j;
strcpy(VarCode.Token,Stk[A]);
GetVarCode( &VarCode);
}
VarCode.Method=1;
strcpy(VarCode.Token,Funcname);
FuncSubDecs3( &VarCode);
if(Use_Static)
{
strcpy(VarCode.Header, join(2,"static ",VarCode.Header));
}
fprintf(Outfile,"%s\n",VarCode.Header);
fprintf(Outfile,"%s%s\n",Scoot,"{");
BumpUp();
break;
}
if(str_cmp(Lookup,"functionreturn")==0)
{
if(CaseFlag)
{
NoBreak2=TRUE;
}
*lszTmp=0;
for(A=3; A<=Ndx; A+=1)
{
strcpy(lszTmp, join(3,lszTmp,Stk[A]," "));
}
if(CurrentFuncType==vt_STRVAR)
{
strcpy(lszTmp, join(2,"BCX_RetStr$ = ",lszTmp));
FuncRetnFlag=1;
UseFlag=TRUE;
}
else
{
FuncRetnFlag=2;
}
if(FuncRetnFlag==2)
{
if(LocalDynaCnt!=0)
{
for(j=1; j<=LocalDynaCnt; j+=1)
{
fprintf(Outfile,"%s%s\n",Scoot,DynaStr[j]);
}
}
if(LocalDynArrCount!=0)
{
for(i=1; i<=LocalDynArrCount; i+=1)
{
fprintf(Outfile,"%s%s\n",Scoot,LocalDynArrName[i]);
}
}
fprintf(Outfile,"%s%s",Scoot,"return ");
LastCmd=2;
}
Parse(lszTmp);
LastCmd=0;
goto EMITAGAIN;
}
if(str_cmp(Lookup,"endfunction")==0 || str_cmp(Lookup,"endsub")==0 || str_cmp(Lookup,"endconstructor")==0 || str_cmp(Lookup,"enddestructor")==0)
{
if(iMatchWrd(Stk[1],"endfunction"))
{
LocalDynaCnt=0;
LocalDynArrCount=0;
}
if(iMatchWrd(Stk[1],"endsub")||iMatchWrd(Stk[1],"endconstructor")||iMatchWrd(Stk[1],"enddestructor"))
{
if(LocalDynaCnt!=0)
{
for(j=1; j<=LocalDynaCnt; j+=1)
{
fprintf(Outfile,"%s%s\n",Scoot,DynaStr[j]);
}
LocalDynaCnt=0;
}
if(LocalDynArrCount!=0)
{
for(i=1; i<=LocalDynArrCount; i+=1)
{
fprintf(Outfile,"%s%s\n",Scoot,LocalDynArrName[i]);
}
LocalDynArrCount=0;
}
}
if(ForceMainToFunc==TRUE)
{
fprintf(Outfile,"%s%s\n",Scoot,"return 0;");
ForceMainToFunc=FALSE;
}
BumpDown();
if(InNameSpace)
{
fprintf(FP2,"%s%s\n",Scoot,"}\n");
}
else
{
fprintf(Outfile,"%s%s\n",Scoot,"}\n\n");
BumpDown();
}
InFunc=FALSE;
Use_Static=FALSE;
if(Outfile==FP3)
{
strcpy(InIfDef,"FP3");
}
Outfile=FP2;
ByrefCnt=0;
break;
}
if(str_cmp(Lookup,"input")==0)
{
EmitInputCode();
break;
}
if(str_cmp(Lookup,"finput")==0)
{
EmitFileInputCode();
break;
}
if(str_cmp(Lookup,"dynamic")==0)
{
int w=0;
char SOF[2048];
HandleNonsense();
strcpy(CVar,Clean(Stk[2]));
ValidVar(CVar);
if(str_cmp(Stk[Ndx],"*")==0)
{
PointerFix();
}
if(str_cmp(Stk[Ndx],"&")==0)
{
*Stk[Ndx--]=0;
strcat(Stk[Ndx],"&");
}
*ZZ=0;
if(iMatchWrd(Stk[Ndx-1],"as"))
{
strcpy(SOF,Stk[Ndx]);
GetTypeInfo(SOF, &w, &id, &vt);
if(vt==vt_STRLIT||vt==vt_DECFUNC||vt==vt_NUMBER||(vt==vt_VOID&&inchr(Stk[Ndx],"*")==0))
{
Abort(join(2,SOF," is not a valid type"));
}
if(vt==vt_FILEPTR&&inchr(SOF,"*")==0)
{
strcat(SOF,"*");
}
Ndx-=2;
}
else
{
vt=DataType(Stk[2]);
id=0;
strcpy(SOF,GetVarTypeName(vt));
}
Use_DynamicA=TRUE;
for(i=3; i<=Ndx; i+=1)
{
strcat(ZZ,Stk[i]);
}
dms=tally(ZZ,"][")+1;
if(dms>1)
{
strcpy(ZZ,replace(ZZ,"][",","));
}
strcpy(ZZ,Clean(ZZ));
RemoveAll(ZZ,"[]");
if(vt==vt_STRVAR)
{
vt=vt_CHAR;
strcpy(SOF,"char");
if(InTypeDef)
{
if(str_cmp(Stk[3],"[")!=0)
{
dms--;
}
else
{
vt=vt_CHARPTR;
}
}
dms++;
strcat(ZZ,",65535");
}
if(InTypeDef)
{
if(vt==vt_STRUCT)
{
fprintf(Outfile,"%s%s%s%s%s%s%s\n",Scoot,"struct _",SOF," ",stringx(dms,42),CVar,";");
}
else
{
fprintf(Outfile,"%s%s%s%s%s%s\n",Scoot,SOF," ",stringx(dms,42),CVar,";");
}
AddTypedefElement(BaseTypeDefsCnt[InTypeDef],vt,CVar,SOF,dms);
}
else if(InFunc)
{
LocalDynArrCount++;
strcpy(LocalDynArrName[LocalDynArrCount], join(9,"if (",CVar,") { DestroyArr((void **)",CVar,",",str(dms),", 1); ",CVar,"=NULL; }"));
fprintf(Outfile,"%s%s%s%s%s%s\n",Scoot,SOF," ",stringx(dms,42),CVar,"=0;");
AddLocal(CVar,vt,id,"",dms,0,0);
}
else
{
if(Use_GenFree)
{
GlobalDynaCnt++;
strcpy(GlobalDynaStr[GlobalDynaCnt], join(9,"if (",CVar,") { DestroyArr((void **)",CVar,",",str(dms),", 1); ",CVar,"=NULL; }"));
}
AddGlobal(CVar,vt,id,"",dms,0,0,0);
}
if(!InTypeDef)
{
fprintf(Outfile,"%s%s%s%s%s%s%s%s%s%s%s%s%s%s\n",Scoot,CVar,"= (",SOF,stringx(dms,42),")CreateArr (",CVar,",sizeof(",SOF,"),0,",trim(str(dms)),",",ZZ,");");
}
break;
}
if(str_cmp(Lookup,"redim")==0)
{
int IsPreserve;
char SOF[2048];
VarInfo* VI;
int vt1=0;
int IsSplat=0;
int BC=0;
int StartPoint;
int AsPos=Ndx;
HandleNonsense();
IsPreserve=iMatchWrd(Stk[2],"preserve");
StartPoint=2+IsPreserve;
vt1=DataType(Stk[StartPoint]);
strcpy(CVar,Clean(Stk[StartPoint]));
IsSplat=iMatchWrd(Stk[StartPoint+1],"*");
ValidVar(CVar);
for(i=Ndx; i>=1; i+=-1)
{
if(iMatchWrd(Stk[AsPos],"as"))
{
AsPos=i-1;
break;
}
}
int L=AsPos;
int SP=0;
while(L>StartPoint)
{
if(str_cmp(Stk[L],"[")==0)
{
BC--;
}
else if(str_cmp(Stk[L],"]")==0)
{
BC++;
if(BC==1)
{
L--;
continue;
}
}
if(BC==0)
{
SP++;
if(str_cmp(Stk[L-1],"]")!=0)
{
break;
}
strcpy(ZZ, join(2,",",ZZ));
}
else
{
strcpy(ZZ, join(2,Stk[L],ZZ));
}
L--;
}
vt=CheckLocal(CVar, &id);
if(vt==vt_UNKNOWN)
{
vt=CheckGlobal(CVar, &id);
if(vt==vt_UNKNOWN)
{
Abort(join(3,"Can not REDIM ",CVar," not previously dimensioned"));
}
VI= &GlobalVars[id];
}
else
{
VI= &LocalVars[id];
}
dms=VI->VarPntr;
if(vt==vt_STRUCT||vt==vt_UDT||vt==vt_UNION)
{
strcpy(SOF,GetElement(StartPoint, &vt, &dms,VI->VarDef));
i=Ndx;
Ndx=L-1;
AsmUnknownStructs(1);
Ndx=i;
RemEmptyTokens();
strcpy(CVar,Clean(Stk[StartPoint]));
IsSplat=iMatchWrd(Stk[StartPoint+1],"*");
}
else
{
strcpy(SOF,GetVarTypeName(vt));
}
if(iMatchWrd(Stk[Ndx-1],"as"))
{
if(str_cmp(SOF,Stk[Ndx])!=0 && !iMatchWrd(Stk[Ndx],"string"))
{
Abort(join(6,"Can not change types for variable ",CVar," previously defined as ",SOF," on line",str(VI->VarLine)));
}
if(iMatchWrd(Stk[Ndx],"string"))
{
Ndx--;
strcpy(Stk[Ndx],"[");
strcpy(Stk[++Ndx],"65535");
strcpy(Stk[++Ndx],"]");
}
else
{
Ndx-=2;
}
}
else
{
if((vt==vt_CHAR&&vt1==vt_STRVAR&&IsSplat==0)||vt==vt_CHARPTR)
{
Ndx++;
strcpy(Stk[Ndx],"[");
strcpy(Stk[++Ndx],"65535");
strcpy(Stk[++Ndx],"]");
}
}
if(str_cmp(Stk[3+IsPreserve],"[")==0)
{
if(IsPreserve)
{
StartPoint=4;
}
else
{
fprintf(Outfile,"%s%s%s%s%s%s%s%s%s%s\n",Scoot,"if (",CVar,") { DestroyArr((void **)",CVar,",",str(dms),", 1); ",CVar,"=NULL; }");
StartPoint=3;
}
Use_DynamicA=TRUE;
A=0;
*ZZ=0;
for(i=StartPoint; i<=Ndx; i+=1)
{
if(str_cmp(Stk[i],"[")==0)
{
A++;
i++;
BC=1;
while(BC>0)
{
if(str_cmp(Stk[i],"[")==0)
{
BC++;
strcat(ZZ,Stk[i]);
}
else
{
if(str_cmp(Stk[i],"]")==0)
{
BC--;
if(BC==0&&i<Ndx)
{
strcat(ZZ,",");
}
if(BC)
{
strcat(ZZ,Stk[i]);
}
}
else
{
strcat(ZZ,Stk[i]);
}
}
i++;
}
i--;
}
}
strcpy(ZZ,Clean(ZZ));
if(vt==vt_STRLIT||vt==vt_DECFUNC||vt==vt_NUMBER||(vt==vt_VOID&&inchr(Stk[Ndx],"*")==0))
{
Abort(join(2,Stk[Ndx]," is not a valid type"));
}
if(vt==vt_STRVAR)
{
strcpy(SOF,"char");
A++;
strcat(ZZ,",65535");
}
if(A!=dms)
{
Abort(join(6,"Mismatch in dimensions for ",CVar,", orignally ",str(dms)," found ",str(A)));
}
fprintf(Outfile,"%s%s%s%s%s%s%s%s%s%s%s%s%d%s%s%s\n",Scoot,CVar,"= (",SOF,stringx(dms,42),")CreateArr (",CVar,",sizeof(",SOF,"),",trim(str(IsPreserve)),",",(int)dms,",",ZZ,");");
break;
}
if(str_cmp(Stk[3],"*")==0 || (IsPreserve&&str_cmp(Stk[4],"*")==0))
{
if(IsPreserve)
{
fprintf(Outfile,"%s%s%s%s%s",Scoot,CVar,"=(char*)realloc(",CVar,",256+");
i=5;
}
else
{
fprintf(Outfile,"%s%s%s%s\n",Scoot,"free(",CVar,");");
fprintf(Outfile,"%s%s%s",Scoot,CVar,"=(char*)calloc(256+");
i=4;
}
for(A=i; A<=Ndx; A+=1)
{
fprintf(Outfile,"%s",Clean(Stk[A]));
}
if(IsPreserve)
{
fprintf(Outfile,"%s\n",");");
}
else
{
fprintf(Outfile,"%s\n",",1);");
}
break;
}
Abort("Invalid REDIM statement");
break;
}
if(str_cmp(Lookup,"dim")==0 || str_cmp(Lookup,"local")==0 || str_cmp(Lookup,"raw")==0 || str_cmp(Lookup,"static")==0 || str_cmp(Lookup,"auto")==0 || str_cmp(Lookup,"register")==0)
{
int w=0;
char UseStatic[2048];
int IsVolatile=0;
char IV[2048];
IsVolatile=iMatchWrd(Stk[2],"volatile");
if(IsVolatile)
{
strcpy(IV,"volatile ");
}
else
{
*IV=0;
}
IsSubOrFuncPtr=SubFuncTest();
HandleNonsense();
if(str_cmp(Stk[Ndx],"*")==0)
{
PointerFix();
}
if(str_cmp(Stk[Ndx],"&")==0)
{
*Stk[Ndx--]=0;
strcat(Stk[Ndx],"&");
}
IsRegister=IsAuto=IsDim=IsLocal=IsStatic=IsRaw=FALSE;
strcpy(Cmd,lcase(Stk[1]));
for(;;)
{
if(str_cmp(Cmd,"dim")==0)
{
IsDim=TRUE;
break;
}
if(str_cmp(Cmd,"local")==0)
{
IsLocal=TRUE;
break;
}
if(str_cmp(Cmd,"static")==0)
{
IsStatic=TRUE;
break;
}
if(str_cmp(Cmd,"raw")==0)
{
IsRaw=TRUE;
break;
}
if(str_cmp(Cmd,"auto")==0)
{
IsAuto=TRUE;
break;
}
if(str_cmp(Cmd,"register")==0)
{
IsRegister=TRUE;
}
break;
}
if(InTypeDef)
{
if(iMatchWrd(Stk[2],"public")||iMatchWrd(Stk[2],"private")||iMatchWrd(Stk[2],"protected"))
{
fprintf(Outfile,"%s%s%s\n",LF,lcase(Stk[2]),":");
break;
}
else if(iMatchWrd(Stk[2],"constructor")||iMatchWrd(Stk[2],"destructor"))
{
DimSubFunc(0);
break;
}
else if(iMatchWrd(Stk[2],"virtual"))
{
*vproc=0;
if(iMatchWrd(Stk[Ndx-1],"=")&&iMatchWrd(Stk[Ndx],"0"))
{
strcpy(vproc, join(2,Stk[Ndx-1],Stk[Ndx]));
Ndx-=2;
}
{int act;
for(act=3; act<=Ndx; act+=1)
{
strcpy(Stk[act-1],Stk[act]);
}
}
Ndx--;
DimSubFunc(0);
break;
}
}
if(IsSubOrFuncPtr)
{
if(IsVolatile)
{
Abort("volatile SUB/FUNCTION pointers not supported");
}
if(DimSubFunc(0))
{
break;
}
}
strcpy(CVar,Clean(Stk[2+IsVolatile]));
ValidVar(CVar);
VType=DataType(Stk[2+IsVolatile]);
if(str_cmp(Stk[3+IsVolatile],"*")==0)
{
if(IsVolatile)
{
Abort("volatile dynamic strings not supported");
}
DimDynaString(CVar,0,0);
break;
}
int iASoffset=0;
char sConst[2048];
int iIsConst;
if(iMatchWrd(Stk[Ndx-1],"as"))
{
iASoffset=Ndx-1;
}
if(iMatchWrd(Stk[Ndx-2],"as"))
{
iASoffset=Ndx-2;
}
if(iASoffset)
{
iIsConst=0;
*sConst=0;
if(iASoffset==Ndx-2)
{
if(iMatchWrd(Stk[Ndx-1],"const"))
{
strcpy(sConst,"const");
iIsConst=1;
}
}
strcpy(Var1,CVar);
IsPointer=tally(Stk[Ndx],"*");
*DimType=0;
*lszTmp=0;
for(i=2+IsVolatile; i<=iASoffset-1; i+=1)
{
strcat(lszTmp,Stk[i]);
if(i>2+IsVolatile)
{
strcat(DimType,Stk[i]);
}
}
strcpy(Var,RemoveStr(Stk[Ndx],"*"));
GetTypeInfo(Var, &w, &id, &vt);
if(vt==vt_STRVAR)
{
strcpy(Stk[Ndx],"char");
strcpy(Var,Stk[Ndx]);
strcat(DimType,"[65535]");
strcat(lszTmp,"[65535]");
}
if(InFunc||InTypeDef)
{
if(IsRegister||IsAuto)
{
if(IsRegister)
{
if(IsVolatile)
{
Abort("Register volatile not supported");
}
if(vt==vt_FILEPTR)
{
fprintf(Outfile,"%s%s",Scoot,"register FILE* ");
}
else
{
fprintf(Outfile,"%s%s%s%s%s%s",Scoot,"register ",sConst," ",Stk[Ndx]," ");
}
}
else
{
if(vt==vt_FILEPTR)
{
fprintf(Outfile,"%s%s%s%s",Scoot,"auto ",IV," FILE* ");
}
else
{
fprintf(Outfile,"%s%s%s%s%s%s%s%s",Scoot,"auto ",IV," ",sConst," ",Stk[Ndx]," ");
}
}
}
else
{
if(IsRaw==TRUE)
{
if(vt==vt_FILEPTR)
{
fprintf(Outfile,"%s%s%s%s",Scoot,"static ",IV," FILE* ");
}
else
{
fprintf(Outfile,"%s%s%s%s%s%s",Scoot,IV,sConst," ",Stk[Ndx]," ");
}
}
else
{
if(InTypeDef)
{
*UseStatic=0;
}
else
{
strcpy(UseStatic,"static ");
}
if(vt==vt_STRUCT)
{
fprintf(Outfile,"%s%s%s%s%s%s%s%s",Scoot,UseStatic,IV,sConst," ","struct _",Stk[Ndx]," ");
}
else
{
if(vt==vt_FILEPTR)
{
fprintf(Outfile,"%s%s%s%s",Scoot,UseStatic,IV,"FILE *");
}
else
{
fprintf(Outfile,"%s%s%s%s%s%s%s",Scoot,UseStatic,IV,sConst," ",Stk[Ndx]," ");
}
}
if(InTypeDef)
{
AddTypedefElement(BaseTypeDefsCnt[InTypeDef],vt,CVar,Var,0);
}
}
}
if(InFunc&&!InTypeDef)
{
AddLocal(Var1,vt,id,DimType,IsPointer,0,0,iIsConst);
}
fprintf(Outfile,"%s%s\n",Clean(lszTmp),";");
if(!InTypeDef&&!IsStatic&&!IsRaw&&!IsRegister&&!IsVolatile)
{
strcpy(T,Clean(extract(lszTmp,"[")));
if(IsPointer)
{
fprintf(Outfile,"%s%s%s%s%s%s%s\n",Scoot,"memset(&",T,",0,sizeof(",Clean(Var)," *","));");
}
else
{
fprintf(Outfile,"%s%s%s%s%s%s\n",Scoot,"memset(&",T,",0,sizeof(",T,"));");
}
}
}
else
{
if(IsVolatile)
{
AddGlobal(Var1,vt,id,DimType,IsPointer,0,3,0,iIsConst);
}
else
{
AddGlobal(Var1,vt,id,DimType,IsPointer,0,0,0,iIsConst);
}
}
break;
}
if(InFunc||InTypeDef)
{
*lszTmp=0;
if(iMatchWrd(Stk[3+IsVolatile],"as"))
{
VType=CheckType(Stk[4+IsVolatile]);
if(VType==vt_CHAR)
{
if(str_cmp(Stk[5],"*")==0)
{
strcpy(lszTmp, join(3,"[",Stk[6+IsVolatile],"]"));
}
}
}
else
{
for(i=3+IsVolatile; i<=Ndx; i+=1)
{
strcat(lszTmp,Stk[i]);
}
strcpy(lszTmp,ltrim(Clean(lszTmp)));
if(VType==vt_STRVAR)
{
if(str_cmp(lszTmp,"[65535]")!=0)
{
strcat(lszTmp,"[2048]");
}
}
}
j=(!InTypeDef BAND !IsStatic BAND !IsRaw BAND !IsRegister);
if(j)
{
strcpy(T,Clean(extract(CVar,"[")));
}
for(;;)
{
if(VType==vt_STRVAR)
{
if(IsRaw)
{
fprintf(Outfile,"%s%s%s%s%s%s\n",Scoot,IV,"char ",CVar,lszTmp,";");
}
else if(IsAuto)
{
fprintf(Outfile,"%s%s%s%s%s%s%s\n",Scoot,"auto ",IV,"char ",CVar,lszTmp,";");
}
else if(IsRegister)
{
if(IsVolatile)
{
Abort("register volatile not supported");
}
fprintf(Outfile,"%s%s%s%s%s\n",Scoot,"register char ",CVar,lszTmp,";");
}
else
{
if(InTypeDef)
{
fprintf(Outfile,"%s%s%s%s%s%s\n",Scoot,IV,"char ",CVar,lszTmp,";");
}
else
{
fprintf(Outfile,"%s%s%s%s%s%s%s\n",Scoot,"static ",IV,"char ",CVar,lszTmp,";");
}
}
if(j&&!IsVolatile)
{
fprintf(Outfile,"%s%s%s%s%s%s\n",Scoot,"memset(&",T,",0,sizeof(",T,"));");
}
break;
}
if(VType>=vt_VarMin&&VType<=vt_VarMax)
{
strcpy(ZZ,GetVarTypeName(VType));
strcpy(ZZ,rpad(ZZ,7));
if(IsRaw)
{
fprintf(Outfile,"%s%s%s%s%s%s%s\n",Scoot,IV,ZZ," ",CVar,lszTmp,";");
}
else if(IsAuto)
{
fprintf(Outfile,"%s%s%s%s%s%s%s%s\n",Scoot,"auto ",IV,ZZ," ",CVar,lszTmp,";");
}
else if(IsRegister)
{
if(IsVolatile)
{
Abort("Regester volatile not supported");
}
fprintf(Outfile,"%s%s%s%s%s%s%s\n",Scoot,"register ",ZZ," ",CVar,lszTmp,";");
}
else
{
if(InTypeDef)
{
fprintf(Outfile,"%s%s%s%s%s%s%s\n",Scoot,IV,ZZ," ",CVar,lszTmp,";");
}
else
{
fprintf(Outfile,"%s%s%s%s%s%s%s%s\n",Scoot,"static ",IV,ZZ," ",CVar,lszTmp,";");
}
}
if(j&&!IsVolatile)
{
fprintf(Outfile,"%s%s%s%s%s%s\n",Scoot,"memset(&",T,",0,sizeof(",T,"));");
}
}
break;
}
if(InFunc&&!InTypeDef)
{
AddLocal(CVar,VType,0,lszTmp,0,0,0);
}
if(InTypeDef)
{
AddTypedefElement(BaseTypeDefsCnt[InTypeDef],VType,CVar,Var,0);
}
break;
}
*lszTmp=0;
for(i=3+IsVolatile; i<=Ndx; i+=1)
{
strcat(lszTmp,Stk[i]);
}
if(VType==vt_STRVAR&&str_cmp(lszTmp,"")!=0)
{
strcat(lszTmp,"[65535]");
}
if(IsVolatile)
{
AddGlobal(CVar,VType,0,lszTmp,0,0,3,0);
}
else
{
AddGlobal(CVar,VType,0,lszTmp,0,0,0,0);
}
break;
}
if(str_cmp(Lookup,"extern")==0)
{
int IsVolatile;
IsSubOrFuncPtr=SubFuncTest();
HandleNonsense();
IsVolatile=iMatchWrd(Stk[2],"volatile");
strcpy(CVar,Clean(Stk[2+IsVolatile]));
ValidVar(CVar);
if(str_cmp(Stk[Ndx],"*")==0)
{
PointerFix();
}
if(str_cmp(Stk[Ndx],"&")==0)
{
*Stk[Ndx--]=0;
strcat(Stk[Ndx],"&");
}
if(str_cmp(Stk[3+IsVolatile],"*")==0)
{
if(IsVolatile)
{
Abort("volatile dynamic strings not supported");
}
DimDynaString(CVar,2,0);
break;
}
if(IsSubOrFuncPtr)
{
if(IsVolatile)
{
Abort("volatile SUB/FUNCTION pointers not supported");
}
if(DimSubFunc(0))
{
break;
}
}
strcpy(Var,Clean(Stk[2+IsVolatile]));
ValidVar(Var);
IsPointer=0;
*DimType=0;
if(iMatchWrd(Stk[Ndx-1],"as"))
{
GetTypeInfo(Stk[Ndx], &IsPointer, &id, &vt);
strcpy(Stk[Ndx],RemoveStr(Stk[Ndx],"*"));
for(i=3+IsVolatile; i<=Ndx-2; i+=1)
{
strcat(DimType,Stk[i]);
}
}
else
{
i=3+IsVolatile;
while(i<=Ndx)
{
strcat(DimType,Stk[i]);
i++;
}
vt=DataType(Stk[2+IsVolatile]);
id=0;
}
if(vt==vt_STRVAR)
{
strcat(DimType,"[65535]");
}
if(IsVolatile)
{
AddGlobal(Var,vt,id,DimType,IsPointer,0,4,0);
}
else
{
AddGlobal(Var,vt,id,DimType,IsPointer,0,1,0);
}
break;
}
if(str_cmp(Lookup,"shared")==0 || str_cmp(Lookup,"global")==0)
{
int w=0;
char SOF[2048];
int IsShared;
int IsVolatile;
IsSubOrFuncPtr=SubFuncTest();
HandleNonsense();
IsVolatile=iMatchWrd(Stk[2],"volatile");
strcpy(CVar,Clean(Stk[2+IsVolatile]));
ValidVar(CVar);
IsShared=iMatchWrd(Stk[1],"shared");
if(str_cmp(Stk[Ndx],"*")==0)
{
PointerFix();
}
if(str_cmp(Stk[Ndx],"&")==0)
{
*Stk[Ndx--]=0;
strcat(Stk[Ndx],"&");
}
if(str_cmp(Stk[3+IsVolatile],"*")==0)
{
if(IsVolatile)
{
Abort("volatile dynamic strings not supported");
}
DimDynaString(CVar,1,IsShared);
break;
}
if(IsSubOrFuncPtr)
{
if(IsVolatile)
{
Abort("volatile SUB/FUNCTION pointers not supported");
}
DimSubFunc(0);
break;
}
if(iMatchWrd(Stk[2],"dynamic"))
{
strcpy(CVar,Clean(Stk[3]));
ValidVar(CVar);
if(iMatchWrd(Stk[Ndx-1],"as"))
{
strcpy(SOF,Stk[Ndx]);
GetTypeInfo(SOF, &w, &id, &vt);
if(vt==vt_STRLIT||vt==vt_DECFUNC||vt==vt_NUMBER||(vt==vt_VOID&&inchr(Stk[Ndx],"*")==0))
{
Abort(join(2,Stk[Ndx]," is not a valid type"));
}
Ndx-=2;
}
else
{
vt=DataType(Stk[3]);
id=0;
strcpy(SOF,GetVarTypeName(vt));
}
Use_DynamicA=TRUE;
*ZZ=0;
for(i=4; i<=Ndx; i+=1)
{
strcat(ZZ,Stk[i]);
}
dms=tally(ZZ,"][")+1;
if(dms>1)
{
strcpy(ZZ,replace(ZZ,"][",","));
}
strcpy(ZZ,Clean(ZZ));
RemoveAll(ZZ,"[]");
if(vt==vt_STRVAR)
{
vt=vt_CHAR;
strcpy(SOF,"char");
dms++;
strcat(ZZ,",65535");
}
if(Use_GenFree)
{
GlobalDynaCnt++;
strcpy(GlobalDynaStr[GlobalDynaCnt], join(9,"if (",CVar,") { DestroyArr((void **)",CVar,",",str(dms),", 1); ",CVar,"=NULL; }"));
}
AddGlobal(CVar,vt,id,"",dms,0,0,0);
fprintf(Outfile,"%s%s%s%s%s%s%s%s%s%s%s%s%s%s\n",Scoot,CVar,"= (",SOF,stringx(dms,42),")CreateArr (",CVar,",sizeof(",SOF,"),0,",trim(str(dms)),",",ZZ,");");
break;
}
IsPointer=0;
strcpy(Var,Clean(Stk[2+IsVolatile]));
ValidVar(Var);
if(iMatchWrd(Stk[Ndx-1],"as"))
{
if(inchr(Stk[Ndx],"*"))
{
IsPointer=tally(Stk[Ndx],"*");
strcpy(Stk[Ndx],RemoveStr(Stk[Ndx],"*"));
}
*DimType=0;
for(i=3+IsVolatile; i<=Ndx-2; i+=1)
{
strcat(DimType,Stk[i]);
}
GetTypeInfo(Stk[Ndx], &w, &id, &vt);
}
else
{
*DimType=0;
i=3+IsVolatile;
while(i<=Ndx)
{
strcat(DimType,Stk[i]);
i++;
}
vt=DataType(Stk[2+IsVolatile]);
id=0;
}
if(vt==vt_STRVAR)
{
strcat(DimType,"[65535]");
}
if(IsShared)
{
if(IsVolatile)
{
AddGlobal(Var,vt,id,DimType,IsPointer,0,5,0);
}
else
{
AddGlobal(Var,vt,id,DimType,IsPointer,0,2,0);
}
}
else
{
if(IsVolatile)
{
AddGlobal(Var,vt,id,DimType,IsPointer,0,3,0);
}
else
{
AddGlobal(Var,vt,id,DimType,IsPointer,0,0,0);
}
}
break;
}
if(str_cmp(Lookup,"while")==0)
{
EmitIfCond("while");
break;
}
if(str_cmp(Lookup,"wend")==0 || str_cmp(Lookup,"endwhile")==0)
{
BumpDown();
fprintf(Outfile,"%s%s\n",Scoot,"}");
BumpDown();
break;
}
if(str_cmp(Lookup,"exit")==0)
{
if(CaseFlag)
{
NoBreak2=TRUE;
}
if(iMatchWrd(Stk[2],"sub"))
{
if(LocalDynaCnt!=0)
{
for(j=1; j<=LocalDynaCnt; j+=1)
{
fprintf(Outfile,"%s%s\n",Scoot,DynaStr[j]);
}
}
if(LocalDynArrCount!=0)
{
for(i=1; i<=LocalDynArrCount; i+=1)
{
fprintf(Outfile,"%s%s\n",Scoot,LocalDynArrName[i]);
}
}
fprintf(Outfile,"%s%s\n",Scoot,"return;");
break;
}
if(iMatchWrd(Stk[2],"function"))
{
if(LocalDynaCnt!=0)
{
for(j=1; j<=LocalDynaCnt; j+=1)
{
fprintf(Outfile,"%s%s\n",Scoot,DynaStr[j]);
}
}
if(LocalDynArrCount!=0)
{
for(i=1; i<=LocalDynArrCount; i+=1)
{
fprintf(Outfile,"%s%s\n",Scoot,LocalDynArrName[i]);
}
}
fprintf(Outfile,"%s%s\n",Scoot,"return 0;");
}
else
{
fprintf(Outfile,"%s%s\n",Scoot,"break;");
}
break;
}
if(str_cmp(Lookup,"goto")==0)
{
if(CaseFlag)
{
NoBreak2=TRUE;
}
fprintf(Outfile,"%s%s%s%s\n",Scoot,"goto ",ucase(Stk[2]),";");
break;
}
if(str_cmp(Lookup,"print")==0)
{
fprintf(Outfile,"%s%s\n",Scoot,PrintWriteFormat(0));
break;
}
if(str_cmp(Lookup,"write")==0)
{
fprintf(Outfile,"%s%s\n",Scoot,PrintWriteFormat(1));
break;
}
if(str_cmp(Lookup,"run")==0)
{
fprintf(Outfile,"%s%s",Scoot,"Run (");
for(A=2; A<=Ndx; A+=1)
{
fprintf(Outfile,"%s",Clean(Stk[A]));
}
fprintf(Outfile,"%s%s\n",Scoot,");");
break;
}
if(str_cmp(Lookup,"color")==0)
{
fprintf(Outfile,"%s%s",Scoot,"color (");
for(A=2; A<=Ndx; A+=1)
{
fprintf(Outfile,"%s",Clean(Stk[A]));
}
fprintf(Outfile,"%s\n",");");
break;
}
if(str_cmp(Lookup,"locate")==0)
{
fprintf(Outfile,"%s%s",Scoot,"locate (");
for(A=2; A<=Ndx; A+=1)
{
fprintf(Outfile,"%s",Clean(Stk[A]));
}
fprintf(Outfile,"%s\n",");");
break;
}
if(str_cmp(Lookup,"cls")==0)
{
fprintf(Outfile,"%s%s\n",Scoot,"cls();");
break;
}
// case else
{
for(B=1; B<=Ndx; B+=1)
{
if(str_cmp(Stk[B],"=")==0)
{
break;
}
}
if(B-1==Ndx)
{
*lszTmp=0;
for(Tmp=1; Tmp<=Ndx; Tmp+=1)
{
strcat(lszTmp,Clean(Stk[Tmp]));
}
strcat(lszTmp,";");
if(FuncRetnFlag==2)
{
fprintf(Outfile,"%s\n",lszTmp);
}
else
{
fprintf(Outfile,"%s%s\n",Scoot,lszTmp);
}
if(FuncRetnFlag==2)
{
FuncRetnFlag=0;
*Stk[1]=0;
if(ZZ)free(ZZ);
return;
}
break;
}
for(i=2; i<=B-1; i+=1)
{
strcat(Stk[1],Stk[i]);
}
A=inchr(Stk[1],"*");
if(A)
{
if(!(inchr(Stk[1],"$")&&A>1))
{
RemoveAll(Stk[1],"$");
goto PROCESSNUMERIC;
}
}
static int strtest;
memset(&strtest,0,sizeof(strtest));
static int varid;
memset(&varid,0,sizeof(varid));
static struct _VarInfo* vi;
memset(&vi,0,sizeof(VarInfo *));
static char vr[2048];
memset(&vr,0,sizeof(vr));
static int brcnt;
memset(&brcnt,0,sizeof(brcnt));
strtest=DataType(Stk[1]);
if(strtest==vt_INTEGER)
{
brcnt=tally(Stk[1],"[");
strcpy(vr,extract(Stk[1],"["));
strtest=CheckLocal(vr, &varid);
if(strtest==vt_UNKNOWN)
{
strtest=CheckGlobal(vr, &varid);
vi= &(GlobalVars[varid]);
}
else
{
vi= &(LocalVars[varid]);
}
if(strtest==vt_CHAR)
{
strtest=vt_STRVAR;
}
if(strtest==vt_STRVAR)
{
if(vi->VarPntr!=0)
{
goto PROCESSNUMERIC;
}
if(tally(vi->VarDim,"[")==brcnt)
{
goto PROCESSNUMERIC;
}
if(tally(vi->VarDim,"[")!=brcnt+1)
{
goto PROCESSNUMERIC;
}
}
}
if(strtest==vt_STRVAR)
{
if(B+1==Ndx)
{
if(str_cmp(Stk[Ndx],DDQ)==0)
{
fprintf(Outfile,"%s%s%s%s\n",Scoot,"*",Clean(Stk[1]),"=0;");
goto STRINGEXIT;
}
}
if(Ndx==3)
{
strcpy(Stk[1],Clean(Stk[1]));
strcpy(Stk[3],Clean(Stk[3]));
if(str_cmp(Stk[1],"BCX_RetStr")==0)
{
fprintf(Outfile,"%s%s%s%s\n",Scoot,"BCX_RetStr=BCX_TmpStr(strlen(",Stk[3],"));");
}
fprintf(Outfile,"%s%s%s%s%s%s\n",Scoot,"strcpy(",Stk[1],",",Stk[3],");");
goto STRINGEXIT;
}
*Arg=0;
*lszTmp=0;
j=k=0;
if(iMatchLft(Stk[3],"$$"))
{
HasStorage=TRUE;
}
strcpy(Var,Clean(Stk[1]));
if(str_cmp(Clean(Stk[B+1]),Var)==0)
{
k=TRUE;
}
for(A=B+1; A<=Ndx; A+=1)
{
if(str_cmp(Stk[A],"&")==0 && str_cmp(Stk[A-1],",")!=0 && str_cmp(Stk[A-1],"(")!=0)
{
j++;
strcat(Arg,lszTmp);
strcpy(lszTmp,",");
}
else
{
strcat(lszTmp,Clean(Stk[A]));
}
}
if(*lszTmp!=0&&str_cmp(lszTmp,",")!=0)
{
strcat(Arg,lszTmp);
}
RemoveAll(Var,SPC);
if(j==0)
{
if(str_cmp(Var,"BCX_RetStr")==0)
{
if(HasStorage)
{
fprintf(Outfile,"%s%s%s%s\n",Scoot,"BCX_RetStr=",Arg,";");
goto STRINGEXIT;
}
else
{
fprintf(Outfile,"%s%s%s%s\n",Scoot,"BCX_RetStr=BCX_TmpStr(strlen(",Arg,"));");
}
}
fprintf(Outfile,"%s%s%s%s%s%s\n",Scoot,"strcpy(",Var,",",Arg,");");
goto STRINGEXIT;
}
if(k==TRUE&&j==1)
{
fprintf(Outfile,"%s%s%s%s\n",Scoot,"strcat(",Arg,");");
goto STRINGEXIT;
}
strcpy(lszTmp,ltrim(str(++j)));
Use_Join=TRUE;
if(str_cmp(Var,"BCX_RetStr")==0)
{
fprintf(Outfile,"%s%s%s%s%s%s\n",Scoot,"BCX_RetStr=join(",lszTmp,",",Arg,");");
}
else
{
fprintf(Outfile,"%s%s%s%s%s%s%s%s\n",Scoot,"strcpy(",Var,", join(",lszTmp,",",Arg,"));");
}
STRINGEXIT:;
break;
}
else
{
PROCESSNUMERIC:;
for(i=2; i<=B; i+=1)
{
*Stk[i]=0;
}
strcpy(Stk[B],"=");
if(str_cmp(Stk[B+1],Stk[1])==0 && Ndx==5)
{
if(Inset(Stk[B+2],"+-*/")&&str_cmp(Stk[B+3],">")!=0)
{
strcpy(Stk[B], join(2,Stk[B+2],Stk[B]));
*Stk[B+1]=0;
*Stk[B+2]=0;
}
}
fprintf(Outfile,"%s%s",Scoot,Clean(Stk[1]));
for(A=2; A<=Ndx; A+=1)
{
if(str_cmp(Stk[A],"!")==0)
{
fprintf(Outfile,"%s","!");
}
else
{
fprintf(Outfile,"%s",Clean(Stk[A]));
}
}
fprintf(Outfile,"%s\n",";");
}
}
break;
}
if(FuncRetnFlag==1)
{
if(LocalDynaCnt!=0)
{
for(j=1; j<=LocalDynaCnt; j+=1)
{
fprintf(Outfile,"%s%s\n",Scoot,DynaStr[j]);
}
}
fprintf(Outfile,"%s%s\n",Scoot,"return BCX_RetStr;");
}
if(ZZ)free(ZZ);
}
void Abort (char *Z)
{
int i=0;
int j=0;
int k=0;
int varnum=0;
char t[2048];
char frmt[2048];
*WarnMsg=0;
if(str_cmp(left(AbortSrc,11),"$BCXVERSION")==0)
{
strcat(WarnMsg,Z);
}
else
{
strcpy(WarnMsg, join(7,WarnMsg,Z," at line",str(ModuleLineNos[ModuleNdx])," in Module: ",trim(Modules[ModuleNdx]),CRLF));
strcpy(WarnMsg, join(3,WarnMsg,"Original line",CRLF));
strcpy(WarnMsg, join(3,WarnMsg,AbortSrc,CRLF));
strcpy(WarnMsg, join(3,WarnMsg,"==============",CRLF));
strcpy(WarnMsg, join(3,WarnMsg,"Current Tokens",CRLF));
strcpy(WarnMsg, join(3,WarnMsg,"==============",CRLF));
for(k=1; k<=Ndx; k+=1)
{
j=strlen(Stk[k]);
if(j<40)
{
j=40-j;
}
else
{
j=8-imod(j,8);
}
strcpy(frmt,lpad(str(k),3));
strcpy(WarnMsg, join(6,WarnMsg,frmt," ",Stk[k],stringx(j,32),CRLF));
strcpy(t,Clean(Stk[k]));
i=CheckLocal(t, &varnum);
if(i!=vt_UNKNOWN)
{
strcpy(WarnMsg, join(3,WarnMsg,"is a LOCAL defined at line",str(LocalVars[varnum].VarLine)));
strcpy(WarnMsg, join(4,WarnMsg," in Module: ",LocalVars[varnum].VarModule,CRLF));
}
else
{
i=CheckGlobal(t, &varnum);
if(i!=vt_UNKNOWN)
{
strcpy(WarnMsg, join(3,WarnMsg,"is a GLOBAL defined at line",str(GlobalVars[varnum].VarLine)));
strcpy(WarnMsg, join(4,WarnMsg," in Module: ",GlobalVars[varnum].VarModule,CRLF));
strcpy(WarnMsg, join(5,WarnMsg," ",Stk[k],GlobalVars[varnum].VarDim," as "));
if(GlobalVars[varnum].VarDef)
{
strcpy(WarnMsg, join(3,WarnMsg,trim(TypeDefs[GlobalVars[varnum].VarDef].VarName),CRLF));
}
else
{
strcpy(WarnMsg, join(3,WarnMsg,trim(GetVarTypeName(GlobalVars[varnum].VarType)),CRLF));
}
}
else
{
if(Stk[k][0]==34)
{
strcpy(WarnMsg, join(3,WarnMsg,"is a STRING LITERAL",CRLF));
}
}
}
}
strcpy(WarnMsg, join(3,WarnMsg,"===============",CRLF));
strcpy(WarnMsg, join(3,WarnMsg,"Original Tokens",CRLF));
strcpy(WarnMsg, join(3,WarnMsg,"===============",CRLF));
XParse(AbortSrc);
for(k=1; k<=Ndx; k+=1)
{
j=strlen(Stk[k]);
if(j<40)
{
j=40-j;
}
else
{
j=8-imod(j,8);
}
strcpy(frmt,lpad(str(k),3));
strcpy(WarnMsg, join(6,WarnMsg,frmt," ",Stk[k],stringx(j,32),CRLF));
strcpy(t,Clean(Stk[k]));
i=CheckLocal(t, &varnum);
if(i!=vt_UNKNOWN)
{
strcpy(WarnMsg, join(3,WarnMsg,"is a LOCAL defined at line",str(LocalVars[varnum].VarLine)));
strcpy(WarnMsg, join(4,WarnMsg," in Module: ",LocalVars[varnum].VarModule,CRLF));
}
else
{
i=CheckGlobal(t, &varnum);
if(i!=vt_UNKNOWN)
{
strcpy(WarnMsg, join(3,WarnMsg,"is a GLOBAL defined at line",str(GlobalVars[varnum].VarLine)));
strcpy(WarnMsg, join(4,WarnMsg," in Module: ",GlobalVars[varnum].VarModule,CRLF));
strcpy(WarnMsg, join(5,WarnMsg," ",Stk[k],GlobalVars[varnum].VarDim," as "));
if(GlobalVars[varnum].VarDef)
{
strcpy(WarnMsg, join(3,WarnMsg,TypeDefs[GlobalVars[varnum].VarDef].VarName,CRLF));
}
else
{
strcpy(WarnMsg, join(3,WarnMsg,GetVarTypeName(GlobalVars[varnum].VarType),CRLF));
}
}
else
{
if(Stk[k][0]==34)
{
strcpy(WarnMsg, join(3,WarnMsg,"is a string literal",CRLF));
}
}
}
}
}
strcat(WarnMsg,CRLF);
CloseAll();
remove (ovrFile);
remove (FileOut);
remove (prcFile);
remove (udtFile);
remove (hdrFile);
remove (cstFile);
remove (datFile);
remove (setFile);
remove (enuFile);
remove ("$t$e$m$p");
if(ErrFile)
{
if((fpErr=fopen(FileErr,"a"))==0)
{
fprintf(stderr,"Can't open file %s\n",FileErr);
exit(1);
}
fprintf(fpErr,"%s%s%d%s%s\n",Z," at line",(int)ModuleLineNos[ModuleNdx]," in Module: ",trim(Modules[ModuleNdx]));
if(fpErr)
{
fclose(fpErr);
fpErr=NULL;
}
}
printf("%s%s%s%s%s\n","Error!",CRLF,FileIn,CRLF,WarnMsg);
FreeGlobals();
fflush(stdout);
exit(1);
}
void BumpDown (void)
{
Indent--;
Indent--;
if(Indent<0)
{
Indent=0;
}
strcpy(Scoot,space(Indent));
}
void BumpUp (void)
{
if(Indent<0)
{
Indent=0;
}
Indent++;
Indent++;
strcpy(Scoot,space(Indent));
}
int BraceCount (char *Arg)
{
char* p;
int braces;
p=Arg;
braces=0;
while(*p)
{
if(*p==c_DblQt)
{
p++;
while(*p!=c_DblQt)
{
if(*p==0)
{
return braces;
}
p++;
}
}
if(*p==125)
{
braces--;
}
if(*p==123)
{
braces++;
}
p++;
}
return braces;
}
char* BracketHandler (char *Src, int l)
{
char* s;
s=Src;
for(;;)
{
if(l==0)
{
for(;;)
{
if(*s==0)
{
break;
}
if(*s==c_DblQt)
{
s++;
while(*s!=c_DblQt)
{
if(*s==0)
{
break;
}
s++;
}
}
if(*s==c_LtBkt)
{
s++;
s=BracketHandler(s,1);
}
if(*s==c_LPar)
{
s++;
s=BracketHandler(s,2);
}
s++;
}
break;
}
if(l==1)
{
while(*s!=c_RtBkt)
{
if(*s==c_DblQt)
{
s++;
while(*s!=c_DblQt)
{
if(*s==0)
{
break;
}
s++;
}
}
if(*s==c_LtBkt)
{
s++;
s=BracketHandler(s,1);
}
if(*s==c_LPar)
{
s++;
s=BracketHandler(s,2);
}
if(*s==c_Komma)
{
*s=1;
}
if(*s==0)
{
break;
}
s++;
}
break;
}
if(l==2)
{
while(*s!=c_RPar)
{
if(*s==c_DblQt)
{
s++;
while(*s!=c_DblQt)
{
if(*s==0)
{
break;
}
s++;
}
}
if(*s==c_LtBkt)
{
s++;
s=BracketHandler(s,1);
}
if(*s==c_LPar)
{
s++;
s=BracketHandler(s,2);
}
if(*s==0)
{
break;
}
s++;
}
}
break;
}
if(l==0)
{
strcpy(Src,replace(Src,chr(1),"]["));
return Src;
}
return s;
}
void Push (char *Z)
{
strcpy(CaseStk[++Pusher],Z);
}
void Pop (char *Z)
{
strcpy(Z,CaseStk[--Pusher]);
}
void EmitEpilog (void)
{
if(NoMain+EndOfProgram==0)
{
fprintf(Outfile,"%s\n","return 0; // End of main program");
BumpDown();
fprintf(Outfile,"%s\n","}");
fflush(Outfile);
}
}
void EmitProlog (void)
{
fprintf(Outfile,"%s\n","");
fprintf(Outfile,"%s\n","int main(int argc, char *argv[])");
fflush(Outfile);
}
void DeclareVariables (void)
{
int i;
int A;
char P[2048];
char VarName[2048];
char VarDim[2048];
char Storage[2048];
if((FP1=fopen(FileOut,"r"))==0)
{
fprintf(stderr,"Can't open file %s\n",FileOut);
exit(1);
}
if((Outfile=fopen("$t$e$m$p","w"))==0)
{
fprintf(stderr,"Can't open file %s\n","$t$e$m$p");
exit(1);
}
if((FP3=fopen(cstFile,"r"))==0)
{
fprintf(stderr,"Can't open file %s\n",cstFile);
exit(1);
}
if(lof(cstFile)>0)
{
fprintf(Outfile,"%s\n","");
fprintf(Outfile,"%s\n","// *************************************************");
fprintf(Outfile,"%s%s\n","// ",BCX_STR_USR_CONST);
fprintf(Outfile,"%s\n","// *************************************************");
fprintf(Outfile,"%s\n","");
}
while(!EoF(FP3))
{
Z[0]=0;
AR_fgets_retval=fgets(Z,65535,FP3);
if(Z[strlen(Z)-1]==10)Z[strlen(Z)-1]=0;
fprintf(Outfile,"%s\n",ltrim(Z));
}
if(FP3)
{
fclose(FP3);
FP3=NULL;
}
if(Use_EnumFile)
{
fprintf(Outfile,"%s\n","// *************************************************");
fprintf(Outfile,"%s\n","// User's GLOBAL ENUM blocks");
fprintf(Outfile,"%s\n","// *************************************************");
if((FP8=fopen(enuFile,"r"))==0)
{
fprintf(stderr,"Can't open file %s\n",enuFile);
exit(1);
}
while(!EoF(FP8))
{
Z[0]=0;
AR_fgets_retval=fgets(Z,65535,FP8);
if(Z[strlen(Z)-1]==10)Z[strlen(Z)-1]=0;
fprintf(Outfile,"%s\n",Z);
}
if(FP8)
{
fclose(FP8);
FP8=NULL;
}
fprintf(Outfile,"%s\n","");
}
if((FP3=fopen(udtFile,"r"))==0)
{
fprintf(stderr,"Can't open file %s\n",udtFile);
exit(1);
}
if(lof(udtFile)>0)
{
fprintf(Outfile,"%s\n","");
fprintf(Outfile,"%s\n","// *************************************************");
fprintf(Outfile,"%s%s\n","// ",BCX_STR_USR_TYPES);
fprintf(Outfile,"%s\n","// *************************************************");
while(!EoF(FP3))
{
Z[0]=0;
AR_fgets_retval=fgets(Z,65535,FP3);
if(Z[strlen(Z)-1]==10)Z[strlen(Z)-1]=0;
fprintf(Outfile,"%s%s\n",Scoot,Z);
}
}
if(FP3)
{
fclose(FP3);
FP3=NULL;
}
if(HFileCnt>0)
{
fprintf(Outfile,"%s\n","");
fprintf(Outfile,"%s\n","// *************************************************");
fprintf(Outfile,"%s\n","// User Include Files");
fprintf(Outfile,"%s\n","// *************************************************");
fprintf(Outfile,"%s\n","");
A=0;
while(A<HFileCnt)
{
fprintf(Outfile,"%s\n",HFiles[A]);
A++;
}
fprintf(Outfile,"%s\n","#include <term.h>");
}
if(Use_SingleFile==TRUE)
{
fprintf(Outfile,"%s\n","");
fprintf(Outfile,"%s\n","// *************************************************");
fprintf(Outfile,"%s%s\n","// ",BCX_STR_SYS_VARS);
fprintf(Outfile,"%s\n","// *************************************************");
fprintf(Outfile,"%s\n","");
if(Use_RegEx)
{
fprintf(Outfile,"%s\n","typedef struct _REGEX");
fprintf(Outfile,"%s\n","{");
fprintf(Outfile,"%s\n"," int count;");
fprintf(Outfile,"%s\n"," regmatch_t matches[1024];");
fprintf(Outfile,"%s\n"," PCHAR results[1024];");
fprintf(Outfile,"%s\n","}REGEX, *LPREGEX;\n");
}
if(Use_Time)
{
fprintf(Outfile,"%s\n","enum TIME_OPTIONS");
fprintf(Outfile,"%s\n","{");
fprintf(Outfile,"%s\n"," TIME,");
fprintf(Outfile,"%s\n"," HOUR,");
fprintf(Outfile,"%s\n"," MINUTE,");
fprintf(Outfile,"%s\n"," SECOND,");
fprintf(Outfile,"%s\n"," APM,");
fprintf(Outfile,"%s\n"," YEAR,");
fprintf(Outfile,"%s\n"," MONTH,");
fprintf(Outfile,"%s\n"," DAY,");
fprintf(Outfile,"%s\n"," DAYNAME,");
fprintf(Outfile,"%s\n"," WEEKDAY,");
fprintf(Outfile,"%s\n"," YEARDAY,");
fprintf(Outfile,"%s\n"," WEEKNUMBER,");
fprintf(Outfile,"%s\n"," DATE,");
fprintf(Outfile,"%s\n"," FULLDATE");
fprintf(Outfile,"%s\n"," };\n");
}
if(Use_Findfirst||Use_Findnext)
{
fprintf(Outfile,"%s\n","typedef struct _FILE_FIND_DATA");
fprintf(Outfile,"%s\n","{");
fprintf(Outfile,"%s\n"," DWORD dwFileAttributes;");
fprintf(Outfile,"%s\n"," DWORD ftCreationTime;");
fprintf(Outfile,"%s\n"," DWORD ftLastAccessTime;");
fprintf(Outfile,"%s\n"," DWORD ftLastWriteTime;");
fprintf(Outfile,"%s\n"," DWORD nFileSizeHigh;");
fprintf(Outfile,"%s\n"," DWORD nFileSizeLow;");
fprintf(Outfile,"%s\n"," char cFileSpec[MAX_PATH];");
fprintf(Outfile,"%s\n"," char cFileName[MAX_PATH];");
fprintf(Outfile,"%s\n"," char path[MAX_PATH];");
fprintf(Outfile,"%s\n"," DIR *FileHandle;");
fprintf(Outfile,"%s\n","}FILE_FIND_DATA, *LPFILE_FIND_DATA;\n");
}
if(Use_Ldouble)
{
fprintf(Outfile,"%s\n","#define LDOUBLE long double");
}
if(Use_Idxqsort)
{
fprintf(Outfile,"%s\n","char*** pppStr;");
}
if(Use_Idxqsort||Use_IdxqsortSt||Use_PtrqsortSt)
{
fprintf(Outfile,"%s\n","int Key;");
}
if(Use_IdxqsortSt)
{
fprintf(Outfile,"%s\n","char* cmp1;");
fprintf(Outfile,"%s\n","int StructSize;");
}
if(Use_PtrqsortSt)
{
fprintf(Outfile,"%s\n","int OffSet;");
}
if(Use_NUL)
{
fprintf(Outfile,"%s\n","char NUL [1]={0}; // Null");
}
if(Use_BEL)
{
fprintf(Outfile,"%s\n","char BEL [2]={7,0}; // Bell");
}
if(Use_BS)
{
fprintf(Outfile,"%s\n","char BS [2]={8,0}; // Back Space");
}
if(Use_TAB)
{
fprintf(Outfile,"%s\n","char TAB [2]={9,0}; // Horz Tab");
}
if(Use_LF)
{
fprintf(Outfile,"%s\n","char LF [2]={10,0}; // Line Feed");
}
if(Use_VT)
{
fprintf(Outfile,"%s\n","char VT [2]={11,0}; // Vert Tab");
}
if(Use_FF)
{
fprintf(Outfile,"%s\n","char FF [2]={12,0}; // Form Feed");
}
if(Use_CR)
{
fprintf(Outfile,"%s\n","char CR [2]={13,0}; // Carr Rtn");
}
if(Use_EOF)
{
fprintf(Outfile,"%s\n","char EF [2]={26,0}; // End-of-File");
}
if(Use_ESC)
{
fprintf(Outfile,"%s\n","char ESC [2]={27,0}; // Escape");
}
if(Use_SPC)
{
fprintf(Outfile,"%s\n","char SPC [2]={32,0}; // Space");
}
if(Use_DQ)
{
fprintf(Outfile,"%s\n","char DQ [2]={34,0}; // Double-Quote");
}
if(Use_DDQ)
{
fprintf(Outfile,"%s\n","char DDQ [3]={34,34,0}; // Double-Double-Quote");
}
if(Use_Crlf)
{
fprintf(Outfile,"%s\n","char CRLF[3]={13,10,0}; // Carr Rtn & Line Feed");
}
if(Use_Console)
{
fprintf(Outfile,"%s\n","int color_fg = 7;");
fprintf(Outfile,"%s\n","int color_bg = 0;");
}
if(Use_Lineinput)
{
fprintf(Outfile,"%s\n","char *AR_fgets_retval;");
}
if(Use_Scan)
{
fprintf(Outfile,"%s\n","int ScanError;");
}
if(Use_Inputbuffer==TRUE)
{
fprintf(Outfile,"%s\n","char InputBuffer[65535];");
}
if(Use_Findfirst||Use_Findnext)
{
fprintf(Outfile,"%s\n","FILE_FIND_DATA FindData;");
}
if(Use_Gosub)
{
fprintf(Outfile,"%s\n","jmp_buf GosubStack[32];");
fprintf(Outfile,"%s\n","int GosubNdx;");
}
if(Use_Dynacall)
{
fprintf(Outfile,"%s\n","HINSTANCE BCX_DllStore[256];");
}
}
if(GlobalVarCnt)
{
fprintf(Outfile,"%s\n","");
fprintf(Outfile,"%s\n","// *************************************************");
fprintf(Outfile,"%s%s\n","// ",BCX_STR_USR_VARS);
fprintf(Outfile,"%s\n","// *************************************************");
fprintf(Outfile,"%s\n","");
}
for(i=1; i<=GlobalVarCnt; i+=1)
{
if(GlobalVars[i].VarEmitFlag)
{
continue;
}
if(str_cmp("",GlobalVars[i].VarDim)==0 && GlobalVars[i].VarCondLevel==0)
{
*P=0;
if(GlobalVars[i].VarPntr)
{
strcpy(P,stringx(GlobalVars[i].VarPntr,42));
}
A=GlobalVars[i].VarType;
if(GlobalVars[i].VarSF)
{
strcpy(VarName, join(3,"(*",GlobalVars[i].VarName,")"));
}
else
{
strcpy(VarName,GlobalVars[i].VarName);
}
strcpy(Storage, join(2,VarStorage[GlobalVars[i].VarExtn],VarConst[GlobalVars[i].VarConstant]));
strcpy(VarDim,GlobalVars[i].VarDim);
PrintGlobal(A,i,Storage,P,VarName,VarDim);
}
}
for(i=1; i<=GlobalVarCnt; i+=1)
{
if(GlobalVars[i].VarEmitFlag)
{
continue;
}
if(str_cmp("",GlobalVars[i].VarDim)!=0 && GlobalVars[i].VarCondLevel==0)
{
if(instr_b(GlobalVars[i].VarDim,"{")==0)
{
*P=0;
if(GlobalVars[i].VarPntr)
{
strcpy(P,stringx(GlobalVars[i].VarPntr,42));
}
A=GlobalVars[i].VarType;
if(GlobalVars[i].VarSF)
{
strcpy(VarName, join(4,"(*",GlobalVars[i].VarName,extract(GlobalVars[i].VarDim,"("),")"));
strcpy(VarDim,mid(GlobalVars[i].VarDim,instr_b(GlobalVars[i].VarDim,"(")));
}
else
{
strcpy(VarName,GlobalVars[i].VarName);
strcpy(VarDim,GlobalVars[i].VarDim);
}
strcpy(Storage, join(2,VarStorage[GlobalVars[i].VarExtn],VarConst[GlobalVars[i].VarConstant]));
PrintGlobal(A,i,Storage,P,VarName,VarDim);
}
}
}
char LastDef[2048];
int LastLevel;
*LastDef=0;
LastLevel=1;
for(i=1; i<=GlobalVarCnt; i+=1)
{
if(GlobalVars[i].VarEmitFlag)
{
continue;
}
if(GlobalVars[i].VarCondLevel)
{
if(LastDef[0]==0)
{
strcpy(LastDef,GlobalVars[i].VarCondDef);
LastLevel=GlobalVars[i].VarCondLevel;
fprintf(Outfile,"%s\n",LastDef);
}
if(str_cmp(LastDef,GlobalVars[i].VarCondDef)!=0)
{
if(str_cmp(GlobalVars[i].VarCondDef,"#else")==0)
{
while(LastLevel>GlobalVars[i].VarCondLevel)
{
fprintf(Outfile,"%s\n","#endif");
LastLevel--;
}
fprintf(Outfile,"%s\n","#else");
strcpy(LastDef,GlobalVars[i].VarCondDef);
}
else
{
while(LastLevel>=GlobalVars[i].VarCondLevel)
{
fprintf(Outfile,"%s\n","#endif");
LastLevel--;
}
strcpy(LastDef,GlobalVars[i].VarCondDef);
LastLevel=GlobalVars[i].VarCondLevel;
fprintf(Outfile,"%s\n",LastDef);
}
}
*P=0;
if(GlobalVars[i].VarPntr)
{
strcpy(P,stringx(GlobalVars[i].VarPntr,42));
}
A=GlobalVars[i].VarType;
if(GlobalVars[i].VarSF)
{
strcpy(VarName, join(3,"(*",GlobalVars[i].VarName,")"));
}
else
{
strcpy(VarName,GlobalVars[i].VarName);
}
strcpy(VarDim,GlobalVars[i].VarDim);
strcpy(Storage, join(2,VarStorage[GlobalVars[i].VarExtn],VarConst[GlobalVars[i].VarConstant]));
PrintGlobal(A,i,Storage,P,VarName,VarDim);
}
}
if(*LastDef)
{
while(LastLevel)
{
fprintf(Outfile,"%s\n","#endif");
LastLevel--;
}
}
fprintf(Outfile,"%s\n","");
if(DllCnt)
{
int i;
char AR_DllName[2048];
fprintf(Outfile,"%s\n","");
fprintf(Outfile,"%s\n","// **********[ DLL Declarations ]**********");
fprintf(Outfile,"%s\n","");
for(i=0; i<=LoadLibsCnt-1; i+=1)
{
if(inchr(Loadlibs[i],"-"))
{
strcpy(AR_DllName,extract(Loadlibs[i],"-"));
}
else if(inchr(Loadlibs[i],"."))
{
strcpy(AR_DllName,extract(Loadlibs[i],"."));
}
fprintf(Outfile,"%s%s%s%s%s\n","void *H_",ucase(AR_DllName)," = dlopen(",enc(Loadlibs[i]),", RTLD_LAZY);");
}
for(i=1; i<=DllCnt; i+=1)
{
fprintf(Outfile,"%s\n",DllDecl[i]);
}
fprintf(Outfile,"%s\n","");
fprintf(Outfile,"%s\n","// ****************************************");
fprintf(Outfile,"%s\n","");
}
if((FP5=fopen(datFile,"r"))==0)
{
fprintf(stderr,"Can't open file %s\n",datFile);
exit(1);
}
if(lof(datFile)>0)
{
fprintf(Outfile,"%s\n","");
fprintf(Outfile,"%s\n","// *************************************************");
fprintf(Outfile,"%s\n","// User Data Statements");
fprintf(Outfile,"%s\n","// *************************************************");
fprintf(Outfile,"%s\n","");
fprintf(Outfile,"%s\n","char * DATA [] =");
fprintf(Outfile,"%s\n","{");
while(!EoF(FP5))
{
Z[0]=0;
AR_fgets_retval=fgets(Z,65535,FP5);
if(Z[strlen(Z)-1]==10)Z[strlen(Z)-1]=0;
fprintf(Outfile,"%s\n",Z);
}
fprintf(Outfile,"%s\n","};");
}
if(FP5)
{
fclose(FP5);
FP5=NULL;
}
while(!EoF(FP1))
{
Z[0]=0;
AR_fgets_retval=fgets(Z,65535,FP1);
if(Z[strlen(Z)-1]==10)Z[strlen(Z)-1]=0;
fprintf(Outfile,"%s\n",Z);
}
CloseAll();
remove (FileOut);
rename ("$t$e$m$p",FileOut);
}
int GetNumArgs (int Strt,int* NdxPos)
{
int CountR=0;
int CountS=0;
int i;
int j=0;
int k=1;
for(i=Strt; i<=Ndx; i+=1)
{
if(str_cmp(Stk[i],"(")==0)
{
CountR++;
k++;
}
else if(str_cmp(Stk[i],")")==0)
{
CountR--;
k--;
if(k==0)
{
break;
}
}
else if(str_cmp(Stk[i],"[")==0)
{
CountS++;
}
else if(str_cmp(Stk[i],"]")==0)
{
CountS--;
}
else if(str_cmp(Stk[i],",")==0 && CountR==0&&CountS==0)
{
j++;
if(NdxPos)
{
*NdxPos=i;
}
}
}
return j;
}
void GetVarCode (VARCODE* varcode)
{
char CB[2048];
char PT[2048];
char PTH[2048];
char VAR[2048];
int vn;
char RF[2048];
if(varcode->Method==mt_Opts3)
{
strcat(varcode->Proto,varcode->Token);
if(str_cmp(varcode->Token,",")==0)
{
strcat(varcode->Header,varcode->Token);
}
return;
}
if(varcode->Method==mt_FuncSubx1)
{
strcpy(varcode->Proto, join(3,varcode->Proto,varcode->AsToken,"(*)("));
strcpy(varcode->Header, join(5,varcode->Header,varcode->AsToken," (*",varcode->Token,")("));
return;
}
if(varcode->Method==mt_FuncSubx2)
{
strcat(varcode->Proto,varcode->AsToken);
strcpy(varcode->Header, join(4,varcode->Header,varcode->AsToken," ",varcode->Token));
return;
}
if(IsCallBack)
{
strcpy(CB,"CALLBACK ");
}
else
{
*CB=0;
}
if(inchr(varcode->Token,"*")||inchr(varcode->AsToken,"*")||varcode->IsPtrFlag)
{
RemoveAll(varcode->Token,"*");
RemoveAll(varcode->AsToken,"*");
strcpy(PT, join(2,stringx(varcode->IsPtrFlag,42)," "));
strcpy(PTH,PT);
}
else
{
strcpy(PTH," ");
*PT=0;
}
if(inchr(varcode->Token,"&"))
{
strcpy(RF," &");
}
else
{
*RF=0;
}
vn=varcode->VarNo;
strcpy(VAR,GetVarTypeName(vn));
for(;;)
{
if(vn==vt_STRVAR)
{
for(;;)
{
if(varcode->Method==mt_ProcessSetCommand)
{
strcpy(varcode->StaticOut, join(2,"static char ",Clean(varcode->Token)));
break;
}
if(varcode->Method==mt_FuncSubDecC_Dec)
{
strcpy(varcode->Functype, join(2,"char * ",CB));
break;
}
if(varcode->Method==mt_FuncSubDecC_Dec2)
{
if(!inchr(varcode->Token,"["))
{
strcpy(varcode->Header, join(4,varcode->Header,"char *",Clean(varcode->Token),", "));
strcat(varcode->Proto,"char *, ");
}
else
{
strcpy(varcode->Header, join(4,varcode->Header,"char ",RemoveStr(Clean(varcode->Token),"*"),", "));
strcat(varcode->Proto,"char [][65535], ");
}
break;
}
if(varcode->Method==mt_Opts)
{
strcpy(varcode->Functype,"char *");
break;
}
if(varcode->Method==mt_Opts2)
{
strcpy(varcode->Header, join(3,varcode->Header,"char * ",Clean(varcode->Token)));
strcat(varcode->Proto,"char* ");
break;
}
if(varcode->Method==mt_OverLoad)
{
strcpy(varcode->Functype,"char *");
break;
}
if(varcode->Method==mt_OverLoad2)
{
strcpy(varcode->Header, join(4,varcode->Header,"char *",Clean(varcode->Token),", "));
}
break;
}
break;
}
if(vn==vt_BOOL||vn==vt_BYTE||vn==vt_COLORREF||vn==vt_DOUBLE||vn==vt_DWORD||vn==vt_FARPROC||vn==vt_HDC||vn==vt_HANDLE||vn==vt_HINSTANCE||vn==vt_HWND||vn==vt_INTEGER||vn==vt_LONG||vn==vt_LPBYTE||vn==vt_LRESULT||vn==vt_SHORT||vn==vt_SINGLE||vn==vt_UINT||vn==vt_ULONG||vn==vt_USHORT||vn==vt_VARIANT||vn==vt_VOID||vn==vt_LDOUBLE)
{
for(;;)
{
if(varcode->Method==mt_ProcessSetCommand)
{
strcpy(varcode->StaticOut, join(4,"static ",VAR," ",Clean(varcode->Token)));
break;
}
if(varcode->Method==mt_FuncSubDecC_Dec)
{
strcpy(varcode->Functype, join(3,VAR,PTH,CB));
break;
}
if(varcode->Method==mt_FuncSubDecC_Dec2)
{
strcpy(varcode->Header, join(5,varcode->Header,VAR,PTH,Clean(varcode->Token),", "));
strcpy(varcode->Proto, join(5,varcode->Proto,VAR,RF,PT,", "));
break;
}
if(varcode->Method==mt_Opts)
{
strcpy(varcode->Functype, join(2,VAR,PTH));
break;
}
if(varcode->Method==mt_Opts2)
{
strcpy(varcode->Header, join(4,varcode->Header,VAR,PTH,Clean(varcode->Token)));
strcpy(varcode->Proto, join(4,varcode->Proto,VAR,RF,PT));
break;
}
if(varcode->Method==mt_OverLoad)
{
strcpy(varcode->Functype, join(2,VAR," "));
break;
}
if(varcode->Method==mt_OverLoad2)
{
strcpy(varcode->Header, join(5,varcode->Header,VAR,PTH,Clean(varcode->Token),", "));
}
break;
}
break;
}
if(vn==vt_FILEPTR||vn==vt_CHAR)
{
for(;;)
{
if(varcode->Method==mt_FuncSubDecC_Dec)
{
strcpy(varcode->Functype, join(3,VAR,PTH,CB));
break;
}
if(varcode->Method==mt_FuncSubDecC_Dec2)
{
strcpy(varcode->Header, join(5,varcode->Header,VAR,PTH,Clean(varcode->Token),", "));
strcpy(varcode->Proto, join(4,varcode->Proto,VAR,PT,", "));
break;
}
if(varcode->Method==mt_Opts)
{
strcpy(varcode->Functype, join(2,VAR,PTH));
break;
}
if(varcode->Method==mt_Opts2)
{
strcpy(varcode->Header, join(4,varcode->Header,VAR,PTH,Clean(varcode->Token)));
strcpy(varcode->Proto, join(3,varcode->Proto,VAR,PT));
break;
}
if(varcode->Method==mt_OverLoad)
{
strcpy(varcode->Functype, join(2,VAR," "));
break;
}
if(varcode->Method==mt_OverLoad2)
{
strcpy(varcode->Header, join(5,varcode->Header,VAR,PTH,Clean(varcode->Token),", "));
}
break;
}
break;
}
if(vn==vt_UDT||vn==vt_STRUCT||vn==vt_UNION)
{
for(;;)
{
if(varcode->Method==mt_ProcessSetCommand)
{
if(vn==vt_UNION)
{
strcpy(varcode->StaticOut, join(2,"static union ",Clean(varcode->Token)));
}
else
{
strcpy(varcode->StaticOut, join(3,"static struct _",Clean(varcode->Token)," "));
}
break;
}
if(varcode->Method==mt_FuncSubDecC_Dec)
{
strcpy(varcode->Functype, join(3,varcode->AsToken,PTH,CB));
break;
}
if(varcode->Method==mt_FuncSubDecC_Dec2)
{
strcpy(varcode->Header, join(5,varcode->Header,varcode->AsToken,PTH,Clean(varcode->Token),", "));
strcpy(varcode->Proto, join(5,varcode->Proto,varcode->AsToken,RF,PT,", "));
break;
}
if(varcode->Method==mt_Opts)
{
strcpy(varcode->Functype, join(2,varcode->AsToken,PTH));
break;
}
if(varcode->Method==mt_Opts2)
{
strcpy(varcode->Header, join(5,varcode->Header,Clean(varcode->AsToken),PTH," ",Clean(varcode->Token)));
strcpy(varcode->Proto, join(4,varcode->Proto,Clean(varcode->AsToken),RF,PT));
break;
}
if(varcode->Method==mt_OverLoad)
{
strcpy(varcode->Functype, join(2,VAR," "));
break;
}
if(varcode->Method==mt_OverLoad2)
{
strcpy(varcode->Header, join(5,varcode->Header,varcode->AsToken,PTH,Clean(varcode->Token),", "));
}
break;
}
break;
}
// case else
{
for(;;)
{
if(varcode->Method==mt_FuncSubDecC_Dec)
{
strcpy(varcode->Functype, join(3,varcode->AsToken,PTH,CB));
break;
}
if(varcode->Method==mt_FuncSubDecC_Dec2)
{
strcpy(varcode->Header, join(5,varcode->Header,varcode->AsToken,PTH,Clean(varcode->Token),", "));
strcpy(varcode->Proto, join(5,varcode->Proto,varcode->AsToken,RF,PT,", "));
break;
}
if(varcode->Method==mt_Opts)
{
strcpy(varcode->Functype, join(2,varcode->AsToken,PTH));
break;
}
if(varcode->Method==mt_Opts2)
{
strcpy(varcode->Header, join(4,varcode->Header,Clean(varcode->AsToken)," ",Clean(varcode->Token)));
strcat(varcode->Proto,Clean(varcode->AsToken));
}
break;
}
}
break;
}
}
void AddProtos (void)
{
char SaveMain[2048];
char *ZZ;
ZZ=(char*)calloc(256+65535,1);
int A;
*SaveMain=0;
if((FP1=fopen(FileOut,"r"))==0)
{
fprintf(stderr,"Can't open file %s\n",FileOut);
exit(1);
}
if((Outfile=fopen("$t$e$m$p","w"))==0)
{
fprintf(stderr,"Can't open file %s\n","$t$e$m$p");
exit(1);
}
while(!EoF(FP1))
{
ZZ[0]=0;
AR_fgets_retval=fgets(ZZ,65535,FP1);
if(ZZ[strlen(ZZ)-1]==10)ZZ[strlen(ZZ)-1]=0;
if(instr_b(ZZ,"int main"))
{
strcpy(SaveMain,ZZ);
break;
}
fprintf(Outfile,"%s\n",ZZ);
}
fprintf(Outfile,"%s\n","");
fprintf(Outfile,"%s\n","// *************************************************");
fprintf(Outfile,"%s%s\n","// ",BCX_STR_STD_MACROS);
fprintf(Outfile,"%s\n","// *************************************************");
fprintf(Outfile,"%s\n","");
if(Use_BcxSplitPath)
{
fprintf(Outfile,"%s\n","#define FDRV 2");
fprintf(Outfile,"%s\n","#define FPATH 4");
fprintf(Outfile,"%s\n","#define FNAME 8");
fprintf(Outfile,"%s\n","#define FEXT 16");
}
if(Use_Cbool)
{
fprintf(Outfile,"%s\n","#define CBOOL(A)(A!=0)?1:0");
}
if(Use_Isptr)
{
fprintf(Outfile,"%s\n","#define IsPtr(a)((DWORD)a)");
}
if(Use_Band)
{
fprintf(Outfile,"%s\n","#define BAND &");
}
if(Use_Bor)
{
fprintf(Outfile,"%s\n","#define BOR |");
}
if(Use_Bnot)
{
fprintf(Outfile,"%s\n","#define BNOT ~(int)");
}
if(Use_Ubound)
{
fprintf(Outfile,"%s\n","#define ubound(T)(sizeof((T))/sizeof((T[0]))-1)");
}
if(Use_Clear)
{
fprintf(Outfile,"%s\n","#define Clear(arg)memset(&arg,0,sizeof(arg))");
}
if(Use_Imod)
{
fprintf(Outfile,"%s\n","#define imod(a,b)((a)%(b))");
}
if(Use_Get)
{
fprintf(Outfile,"%s\n","#define GET(A,B,C) F_GetVal=fread(B,1,C,A)");
AddGlobal("F_GetVal",vt_INTEGER,0,"",0,0,0,0);
}
if(Use_Put)
{
fprintf(Outfile,"%s\n","#define PUT(A,B,C) F_PutVal=fwrite(B,1,C,A)");
AddGlobal("F_PutVal",vt_INTEGER,0,"",0,0,0,0);
}
if(Use_Strptr)
{
fprintf(Outfile,"%s\n","#define STRPTR(A)((char*)&(A))");
}
if(Use_Val)
{
fprintf(Outfile,"%s\n","#define VAL(a)(double)atof(a)");
}
if(Use_Vall)
{
fprintf(Outfile,"%s\n","#define VALL(a) (long double)strtold(a,(char**)NULL)");
}
if(Use_Fint)
{
fprintf(Outfile,"%s\n","#define FINT(a)floor(a)");
}
if(Use_Frac)
{
fprintf(Outfile,"%s\n","#define FRAC(a)(double)(a-FIX(a))");
Use_Fix=TRUE;
}
if(Use_Fracl)
{
fprintf(Outfile,"%s\n","#define FRACL(a)(long double)(a-FIX(a))");
Use_Fix=TRUE;
}
if(Use_Fix)
{
fprintf(Outfile,"%s\n","#define FIX(a)(int)((a))");
}
if(Use_Csng)
{
fprintf(Outfile,"%s\n","#define CSNG(a)((float)(a))");
}
if(Use_Cdbl)
{
fprintf(Outfile,"%s\n","#define CDBL(a)((double)(a))");
}
if(Use_Cldbl)
{
fprintf(Outfile,"%s\n","#define CLDBL(a)((long double)(a))");
}
if(Use_Threads)
{
fprintf(Outfile,"%s\n","#define BCX_THREAD(fn,arg) ({ pthread_t tid; pthread_create(&tid, NULL, (void*(*)(void*))fn, arg); tid;})");
fprintf(Outfile,"%s\n","#define BCX_THREADWAIT(a) pthread_join(a, NULL)");
fprintf(Outfile,"%s\n","#define BCX_INITLOCK(a) pthread_mutex_init(a, NULL)");
fprintf(Outfile,"%s\n","#define BCX_THREADLOCK(a) pthread_mutex_lock (a)");
fprintf(Outfile,"%s\n","#define BCX_THREADUNLOCK(a) pthread_mutex_unlock (a)");
fprintf(Outfile,"%s\n","#define BCX_THREADKILL(t) pthread_cancel(t)");
fprintf(Outfile,"%s\n","#define BCX_THREADEND pthread_exit(0)");
}
fprintf(Outfile,"%s\n","");
fprintf(Outfile,"%s\n","");
fprintf(Outfile,"%s\n","// *************************************************");
fprintf(Outfile,"%s%s\n","// ",BCX_STR_STD_PROTOS);
fprintf(Outfile,"%s\n","// *************************************************");
fprintf(Outfile,"%s\n","");
if(NoRT==FALSE)
{
if(Use_Clng)
{
fprintf(Outfile,"%s\n","long CLNG(double);");
}
if(Use_Cint)
{
fprintf(Outfile,"%s\n","int Cint(double);");
}
if(Use_StartupCode)
{
fprintf(Outfile,"%s\n","int BCX_StartupCode_(void);");
}
if(Use_ExitCode)
{
fprintf(Outfile,"%s\n","int BCX_ExitCode_(void);");
}
if(Use_Str_Cmp)
{
fprintf(Outfile,"%s\n","int str_cmp(char*, char*);");
}
if(Use_Eof)
{
fprintf(Outfile,"%s\n","int EoF (FILE*);");
}
if(Use_CopyFile)
{
fprintf(Outfile,"%s\n","void CopyFile (char *,char *,int=FALSE);");
}
if(Use_QBColor)
{
fprintf(Outfile,"%s\n","int qbcolor (int);");
}
if(Use_Cls)
{
fprintf(Outfile,"%s\n","void cls(void);");
}
if(Use_Color)
{
fprintf(Outfile,"%s\n","void color (int,int);");
}
if(Use_Locate)
{
fprintf(Outfile,"%s\n","void locate (int,int,int=1,int=12);");
}
if(Use_Run)
{
fprintf(Outfile,"%s\n","int Run (char*, int =1, int =0);");
}
if(Use_Randomize)
{
fprintf(Outfile,"%s\n","void randomize (unsigned int);");
}
if(Use_Midstr)
{
fprintf(Outfile,"%s\n","void midstr (char*, int, int, char *);");
}
if(Use_Swap)
{
fprintf(Outfile,"%s\n","void swap (UCHAR*,UCHAR*,int);");
}
if(UseFlag)
{
fprintf(Outfile,"%s\n","char* BCX_TmpStr(size_t);");
}
if(Use_sziif)
{
fprintf(Outfile,"%s\n","char* sziif (bool,char*,char*);");
}
if(Use_Using)
{
fprintf(Outfile,"%s\n","char* Using (char*,double);");
}
if(Use_TempFileName)
{
fprintf(Outfile,"%s\n","char* TempFileName (char*,char*);");
}
if(Use_AppExePath)
{
fprintf(Outfile,"%s\n","char* AppExePath (void);");
}
if(Use_AppExeName)
{
fprintf(Outfile,"%s\n","char* AppExeName (void);");
}
if(Use_Lcase)
{
fprintf(Outfile,"%s\n","char* lcase (char*);");
}
if(Use_Ucase)
{
fprintf(Outfile,"%s\n","char* ucase (char*);");
}
if(Use_Mid)
{
fprintf(Outfile,"%s\n","char* mid (char*, int, int=-1);");
}
if(Use_Ltrim)
{
fprintf(Outfile,"%s\n","char* ltrim (char*,char=32);");
}
if(Use_Rtrim)
{
fprintf(Outfile,"%s\n","char* rtrim (char*,char=32);");
}
if(Use_Trim)
{
fprintf(Outfile,"%s\n","char* trim (char*);");
}
if(Use_Strim)
{
fprintf(Outfile,"%s\n","char* strim (char*);");
}
if(Use_Left)
{
fprintf(Outfile,"%s\n","char* left (char*,int);");
}
if(Use_Right)
{
fprintf(Outfile,"%s\n","char* right (char*,int);");
}
if(Use_Rpad)
{
fprintf(Outfile,"%s\n","char* rpad (char*,int,int=32);");
}
if(Use_Lpad)
{
fprintf(Outfile,"%s\n","char* lpad (char*,int,int=32);");
}
if(Use_String)
{
fprintf(Outfile,"%s\n","char* stringx (int,int);");
}
if(Use_Repeat)
{
fprintf(Outfile,"%s\n","char* repeat (int,char*);");
}
if(Use_Extract)
{
fprintf(Outfile,"%s\n","char* extract (char*,char*);");
}
if(Use_Remain)
{
fprintf(Outfile,"%s\n","char* remain (char*,char*);");
}
if(Use_Reverse)
{
fprintf(Outfile,"%s\n","char* reverse (char*);");
}
if(Use_Command)
{
fprintf(Outfile,"%s\n","char* command (int=-1);");
}
if(Use_Mcase)
{
fprintf(Outfile,"%s\n","char* mcase (char*);");
}
if(Use_Replace)
{
fprintf(Outfile,"%s\n","char* replace (char*,char*,char*);");
}
if(Use_iReplace)
{
fprintf(Outfile,"%s\n","char* iReplace (char*,char*,char*);");
}
if(Use_Shell)
{
fprintf(Outfile,"%s\n","void Shell (char *);");
}
if(Use_Space)
{
fprintf(Outfile,"%s\n","char* space (int a);");
}
if(Use_Str)
{
fprintf(Outfile,"%s\n","char* str (double);");
}
if(Use_Strl)
{
fprintf(Outfile,"%s\n","char* strl (long double);");
}
if(Use_Findfirst)
{
fprintf(Outfile,"%s\n","char* findfirst (char*, FILE_FIND_DATA*);");
}
if(Use_Findnext)
{
fprintf(Outfile,"%s\n","char* findnext (FILE_FIND_DATA*);");
}
if(Use_Curdir)
{
fprintf(Outfile,"%s\n","char* curdir (void);");
}
if(Use_Sysdir)
{
fprintf(Outfile,"%s\n","char* sysdir (void);");
}
if(Use_Tempdir)
{
fprintf(Outfile,"%s\n","char* tempdir (void);");
}
if(Use_Environ)
{
fprintf(Outfile,"%s\n","char* Environ (char*);");
}
if(Use_Boolstr)
{
fprintf(Outfile,"%s\n","char* BoolStr (int);");
}
if(Use_Hex)
{
fprintf(Outfile,"%s\n","char* hex (int);");
}
if(Use_Bin)
{
fprintf(Outfile,"%s\n","char* Bin (int);");
}
if(Use_Oct)
{
fprintf(Outfile,"%s\n","char* oct (int);");
}
if(Use_Now)
{
fprintf(Outfile,"%s\n","char* now (void);");
}
if(Use_SearchPath)
{
fprintf(Outfile,"%s\n","char* SEARCHPATH (char *);");
}
if(Use_StrUpLow)
{
fprintf(Outfile,"%s\n","char* _strupr_(char *);");
fprintf(Outfile,"%s\n","char* _strlwr_(char *);");
}
if(Use_BcxSplitPath)
{
fprintf(Outfile,"%s\n","char* BcxSplitPath (char *, int);");
fprintf(Outfile,"%s\n","void _splitpath_(const char* path, char* drv, char* dir, char* name, char* ext);");
}
if(Use_Strtoken)
{
fprintf(Outfile,"%s\n","char* StrToken (char*,char*,int);");
}
if(Use_FileLocked)
{
fprintf(Outfile,"%s\n","int FileLocked (char*);");
}
if(Use_FillArray)
{
fprintf(Outfile,"%s\n","int fillarray (char *, int, int, void *);");
}
if(Use_Remove)
{
fprintf(Outfile,"%s\n","char* RemoveStr (char*,char*);");
}
if(Use_IRemove)
{
fprintf(Outfile,"%s\n","char* IRemoveStr (char*,char*);");
}
if(Use_Time)
{
fprintf(Outfile,"%s\n","char* timef (int i=0);");
}
if(Use_Join)
{
fprintf(Outfile,"%s\n","char* join (int, ... );");
}
if(Use_Enclose)
{
fprintf(Outfile,"%s\n","char* enc (char*, int=0, int=0);");
}
if(Use_Chr)
{
fprintf(Outfile,"%s","char* chr");
fprintf(Outfile,"%s\n","(int,int=0,int=0,int=0,int=0,int=0,int=0,int=0,int=0,int=0);");
}
if(Use_VChr)
{
fprintf(Outfile,"%s\n","char* vchr (int,...);");
}
if(Use_Freefile)
{
fprintf(Outfile,"%s\n","FILE* FreeFile (void);");
}
if(Use_PeekStr)
{
fprintf(Outfile,"%s\n","char* peekstr (LPVOID,int);");
}
if(Use_Asc)
{
fprintf(Outfile,"%s\n","int asc (char*,int=0);");
}
if(Use_Instrrev)
{
fprintf(Outfile,"%s\n","int InstrRev (char*,char*,int=0,int=0);");
}
if(Use_Instr)
{
fprintf(Outfile,"%s\n","int instr_b(char*,char*,int=0,int=0);");
}
if(UseLCaseTbl)
{
fprintf(Outfile,"%s\n","char *MakeLCaseTbl(void);");
}
if(Use_Stristr)
{
fprintf(Outfile,"%s\n","char *_stristr_(char*,char*);");
}
if(Use_StrStr)
{
fprintf(Outfile,"%s\n","char *_strstr_(char*,char*);");
}
if(Use_Verify)
{
fprintf(Outfile,"%s\n","int Verify (char *, char *);");
fprintf(Outfile,"%s\n","int VerifyInstr(char*,char*,int=0);");
}
if(Use_Retain)
{
fprintf(Outfile,"%s\n","char* Retain (char*,char *);");
}
if(Use_LoadFile)
{
fprintf(Outfile,"%s\n","char* LoadFile (char*);");
}
if(Use_Inchr)
{
fprintf(Outfile,"%s\n","int inchr (char*,char*);");
}
if(Use_Idxqsort)
{
fprintf(Outfile,"%s\n","int IdxCompare (const void *,const void *);");
}
if(Use_IdxqsortSt)
{
fprintf(Outfile,"%s\n","int IdxCompareSt (const void *,const void *);");
}
if(Use_PtrqsortSt)
{
fprintf(Outfile,"%s\n","int PtrCompareSt (const void *,const void *);");
}
if(Use_Strqsorta)
{
fprintf(Outfile,"%s\n","int StrCompareA (const void *,const void *);");
}
if(Use_Strqsortd)
{
fprintf(Outfile,"%s\n","int StrCompareD (const void *,const void *);");
}
if(Use_DynStrqsorta)
{
fprintf(Outfile,"%s\n","int DynStrCompareA (const void *,const void *);");
}
if(Use_DynStrqsortd)
{
fprintf(Outfile,"%s\n","int DynStrCompareD (const void *,const void *);");
}
if(Use_Numqsortaint)
{
fprintf(Outfile,"%s\n","int NumCompareAint (const void *,const void *);");
}
if(Use_Numqsortdint)
{
fprintf(Outfile,"%s\n","int NumCompareDint (const void *,const void *);");
}
if(Use_Numqsortafloat)
{
fprintf(Outfile,"%s\n","int NumCompareAfloat (const void *,const void *);");
}
if(Use_Numqsortdfloat)
{
fprintf(Outfile,"%s\n","int NumCompareDfloat (const void *,const void *);");
}
if(Use_Numqsortadouble)
{
fprintf(Outfile,"%s\n","int NumCompareAdouble (const void *,const void *);");
}
if(Use_Numqsortddouble)
{
fprintf(Outfile,"%s\n","int NumCompareDdouble (const void *,const void *);");
}
if(Use_Like)
{
fprintf(Outfile,"%s\n","int like (char*,char*);");
}
if(Use_Tally)
{
fprintf(Outfile,"%s\n","int tally (char*,char*,int=0);");
}
if(Use_Inkey)
{
fprintf(Outfile,"%s\n","char* inkey (void);");
}
if(Use_InkeyD)
{
fprintf(Outfile,"%s\n","int inkeyd (void);");
}
if(Use_Instat)
{
fprintf(Outfile,"%s\n","int kbhit(void);");
}
if(Use_GetCh)
{
fprintf(Outfile,"%s\n","int _getch_(int);");
}
if(Use_Bin2dec)
{
fprintf(Outfile,"%s\n","int Bin2Dec (char*);");
}
if(Use_Hex2Dec)
{
fprintf(Outfile,"%s\n","int Hex2Dec (char*);");
}
if(Use_Download)
{
fprintf(Outfile,"%s\n","int Download (char*,char*);");
}
if(Use_Embed)
{
fprintf(Outfile,"%s\n","char* GetResource (int* );");
}
if(Use_Exist)
{
if(Use_Osx)
{
fprintf(Outfile,"%s\n","bool Exist (char*);");
}
else
{
fprintf(Outfile,"%s\n","BOOL Exist (char*);");
}
}
if(Use_Ins)
{
fprintf(Outfile,"%s\n","char* ins (char *S, int i, char *a);");
}
if(Use_Del)
{
fprintf(Outfile,"%s\n","char* del (char*,int,int);");
}
if(Use_Pause)
{
fprintf(Outfile,"%s\n","void Pause (void);");
}
if(Use_Keypress)
{
fprintf(Outfile,"%s\n","int keypress (void);");
}
if(Use_Lof)
{
fprintf(Outfile,"%s\n","DWORD lof (char*);");
}
if(Use_Sgn)
{
fprintf(Outfile,"%s\n","double sgn (double);");
}
if(Use_Round)
{
fprintf(Outfile,"%s\n","double Round (double,int);");
}
if(Use_Rnd)
{
fprintf(Outfile,"%s\n","float rnd (void);");
}
if(Use_Exp)
{
fprintf(Outfile,"%s\n","double Exp (double);");
}
if(Use_Min)
{
fprintf(Outfile,"%s\n","double _MIN_ (double,double);");
}
if(Use_Max)
{
fprintf(Outfile,"%s\n","double _MAX_ (double,double);");
}
if(Use_Timer)
{
fprintf(Outfile,"%s\n","float timer (void);");
}
if(Use_Iif)
{
fprintf(Outfile,"%s\n","double iif (bool,double,double);");
}
if(Use_Loc)
{
fprintf(Outfile,"%s\n","int loc (FILE *fp, int fplen);");
}
if(Use_Rec)
{
fprintf(Outfile,"%s\n","int rec (FILE *fp, int fplen);");
}
if(Use_RecCount)
{
fprintf(Outfile,"%s\n","int reccount (FILE *fp, int fplen);");
}
if(Use_Scan)
{
fprintf(Outfile,"%s\n","int scan (char *input, char *format, ... );");
}
if(Use_Split)
{
fprintf(Outfile,"%s\n","int Split (char [][65535], char*, char*, int=0);");
}
if(Use_DSplit)
{
fprintf(Outfile,"%s\n","int DSplit (PCHAR *, char*, char*, int=0);");
}
if(Use_SysStr)
{
fprintf(Outfile,"%s\n","BSTR SysStr (char * szIn, int=0, int=0);");
}
if(Use_WideToAnsi)
{
fprintf(Outfile,"%s\n","char* WideToAnsi (wchar_t *, UINT=0, DWORD=0);");
}
if(Use_AnsiToWide)
{
fprintf(Outfile,"%s\n","wchar_t* AnsiToWide (char*,UINT=0,DWORD=0);");
}
if(Use_Cvi)
{
fprintf(Outfile,"%s\n","short CVI (char*);");
}
if(Use_Mki)
{
fprintf(Outfile,"%s\n","char* MKI (short);");
}
if(Use_Cvl)
{
fprintf(Outfile,"%s\n","long CVL (char*);");
}
if(Use_Mkl)
{
fprintf(Outfile,"%s\n","char* MKL (int);");
}
if(Use_Cvs)
{
fprintf(Outfile,"%s\n","float CVS (char*);");
}
if(Use_Mks)
{
fprintf(Outfile,"%s\n","char* MKS (float);");
}
if(Use_Cvd)
{
fprintf(Outfile,"%s\n","double CVD (char*);");
}
if(Use_Cvld)
{
fprintf(Outfile,"%s\n","long double CVLD (char*);");
}
if(Use_Mkd)
{
fprintf(Outfile,"%s\n","char* MKD (double);");
}
if(Use_Mkld)
{
fprintf(Outfile,"%s\n","char* MKLD (long double);");
}
if(Use_OSVersion)
{
fprintf(Outfile,"%s\n","int OSVersion (void);");
}
if(Use_Dynacall)
{
fprintf(Outfile,"%s\n","HINSTANCE BCX_LoadDll(char *);");
fprintf(Outfile,"%s\n","void BCX_UnloadDll(void);");
fprintf(Outfile,"%s\n","typedef int (CALLBACK *DYNACALL1)(void);");
fprintf(Outfile,"%s\n","int BCX_DynaCall(char *, char *, int, ...);");
}
if(Use_DynamicA)
{
fprintf(Outfile,"%s\n","void* CreateArr (void*,int,int,int,...);");
fprintf(Outfile,"%s\n","void* CreateArr_internal(void*, int, int, int, va_list);");
fprintf(Outfile,"%s\n","void DestroyArr (void**,int,int);");
}
if(Use_ContainedIn)
{
fprintf(Outfile,"%s\n","int containedin(char * ,char **,int=0);");
}
if(Use_FindInType)
{
fprintf(Outfile,"%s\n","int FindInType(char *,char *,int,int,int,int=0,int* =0);");
}
if(Use_SingleFile==FALSE)
{
if((fpHFile=fopen(HFile,"w"))==0)
{
fprintf(stderr,"Can't open file %s\n",HFile);
exit(1);
}
}
/*****2010-11-24ChangeTOemitwxAppCLASSDefinitionFORWXCONSOLEApps-AIR*****/;
if(Use_Wx)
{
fprintf(Outfile,"%s\n","");
fprintf(Outfile,"%s%s%s\n","class ",BcxSplitPath(FileIn,FNAME),": public wxApp {");
fprintf(Outfile,"%s\n"," public:");
fprintf(Outfile,"%s\n"," virtual bool OnInit();");
fprintf(Outfile,"%s\n","};");
fprintf(Outfile,"%s\n","");
fprintf(Outfile,"%s%s%s\n","IMPLEMENT_APP(",BcxSplitPath(FileIn,FNAME),")");
fprintf(Outfile,"%s\n","");
}
if(Use_Socket)
{
fprintf(Outfile,"%s\n","");
fprintf(Outfile,"%s\n","sockaddr_in sock_addr (char* ,int=80);");
fprintf(Outfile,"%s\n","int connect_socket (sockaddr_in);");
fprintf(Outfile,"%s\n","int BcxSocket (char* ,int=80);");
fprintf(Outfile,"%s\n","int BcxSocketSend (int, char *);");
fprintf(Outfile,"%s\n","int BcxSocketRead (int, char *);");
fprintf(Outfile,"%s\n","void BcxSocketClose(int);");
fprintf(Outfile,"%s\n","");
}
if(Use_RegEx)
{
fprintf(Outfile,"%s\n","bool regmatch (char *, char *, REGEX* );");
}
}
if(ProtoCnt)
{
fprintf(Outfile,"%s\n","");
fprintf(Outfile,"%s\n","// *************************************************");
fprintf(Outfile,"%s%s\n","// ",BCX_STR_USR_PROTOS);
fprintf(Outfile,"%s\n","// *************************************************");
fprintf(Outfile,"%s\n","");
char LastDef[2048];
int LastLevel;
*LastDef=0;
LastLevel=1;
for(A=1; A<=ProtoCnt; A+=1)
{
if(LastDef[0]==0)
{
strcpy(LastDef,ProtoType[A].Condition);
LastLevel=ProtoType[A].CondLevel;
if(Use_SingleFile==FALSE)
{
if(LastDef[0]>0)
{
fprintf(fpHFile,"%s\n",LastDef);
}
}
if(LastDef[0]>0)
{
fprintf(Outfile,"%s\n",LastDef);
}
}
if(str_cmp(LastDef,ProtoType[A].Condition)!=0)
{
if(str_cmp(ProtoType[A].Condition,"#else")==0)
{
while(LastLevel>ProtoType[A].CondLevel)
{
if(Use_SingleFile==FALSE)
{
fprintf(fpHFile,"%s\n","#endif");
}
fprintf(Outfile,"%s\n","#endif");
LastLevel--;
}
if(Use_SingleFile==FALSE)
{
fprintf(fpHFile,"%s\n","#else");
}
fprintf(Outfile,"%s\n","#else");
strcpy(LastDef,ProtoType[A].Condition);
LastLevel=ProtoType[A].CondLevel;
}
else
{
while(LastLevel>ProtoType[A].CondLevel)
{
if(Use_SingleFile==FALSE)
{
fprintf(fpHFile,"%s\n","#endif");
}
fprintf(Outfile,"%s\n","#endif");
LastLevel--;
}
strcpy(LastDef,ProtoType[A].Condition);
LastLevel=ProtoType[A].CondLevel;
if(Use_SingleFile==FALSE)
{
if(LastDef[0]>0)
{
fprintf(fpHFile,"%s\n",LastDef);
}
}
if(LastDef[0]>0)
{
fprintf(Outfile,"%s\n",LastDef);
}
}
}
if(UseStdCall&&UseCpp)
{
if(str_cmp(left(ProtoType[A].Prototype,9),"C_EXPORT ")==0)
{
EmitExportDef(ProtoType[A].Prototype);
}
}
strcpy(T,extract(ProtoType[A].Prototype,SPC));
strcpy(T, join(2,rpad(T,7),SPC));
strcpy(ProtoType[A].Prototype, join(2,T,remain(ProtoType[A].Prototype,SPC)));
if(Use_SingleFile==FALSE)
{
fprintf(fpHFile,"%s\n",ProtoType[A].Prototype);
}
if(UseCpp==FALSE&&!instr_b(ProtoType[A].Prototype,"::"))
{
fprintf(Outfile,"%s\n",ProtoType[A].Prototype);
}
}
if(*LastDef)
{
while(LastLevel>0)
{
if(Use_SingleFile==FALSE)
{
fprintf(fpHFile,"%s\n","#endif");
}
fprintf(Outfile,"%s\n","#endif");
LastLevel--;
}
}
}
fprintf(Outfile,"%s\n","");
char P[2048];
int i;
char VarName[2048];
char VarDim[2048];
char Storage[2048];
char VAR[2048];
if(GlobalVarCnt>0)
{
fprintf(Outfile,"%s\n","");
fprintf(Outfile,"%s\n","// *************************************************");
fprintf(Outfile,"%s\n","// User Global Initialized Arrays");
fprintf(Outfile,"%s\n","// *************************************************");
fprintf(Outfile,"%s\n","");
for(i=1; i<=GlobalVarCnt; i+=1)
{
if(GlobalVars[i].VarEmitFlag)
{
continue;
}
if(str_cmp("",GlobalVars[i].VarDim)!=0 && GlobalVars[i].VarCondLevel==0)
{
if(instr_b(GlobalVars[i].VarDim,"{"))
{
*P=0;
if(GlobalVars[i].VarPntr)
{
strcpy(P,stringx(GlobalVars[i].VarPntr,42));
}
A=GlobalVars[i].VarType;
if(GlobalVars[i].VarSF)
{
strcpy(VarName, join(4,"(*",GlobalVars[i].VarName,extract(GlobalVars[i].VarDim,"("),")"));
strcpy(VarDim,mid(GlobalVars[i].VarDim,instr_b(GlobalVars[i].VarDim,"(")));
}
else
{
strcpy(VarName,GlobalVars[i].VarName);
strcpy(VarDim,GlobalVars[i].VarDim);
}
strcpy(Storage, join(2,VarStorage[GlobalVars[i].VarExtn],VarConst[GlobalVars[i].VarConstant]));
for(;;)
{
if(A==vt_STRVAR)
{
fprintf(Outfile,"%s%s%s%s%s\n",Storage,"char ",VarName,VarDim,";");
break;
}
if(A==vt_FILEPTR)
{
strcpy(GlobalVars[i].VarName,RemoveStr(GlobalVars[i].VarName,"@"));
fprintf(Outfile,"%s%s%s%s%s\n",Storage,"FILE *",VarName,VarDim,";");
break;
}
if(A==vt_BOOL)
{
fprintf(Outfile,"%s%s%s%s%s\n",Storage,"bool ",VarName,VarDim,";");
break;
}
if(A==vt_UDT||A==vt_STRUCT||A==vt_UNION)
{
strcpy(VAR,TypeDefs[GlobalVars[i].VarDef].VarName);
strcpy(VAR,rpad(VAR,7));
fprintf(Outfile,"%s%s%s%s%s%s%s\n",Storage,VAR," ",P,VarName,VarDim,";");
break;
}
if(A>=vt_VarMin&&A<=vt_VarMax)
{
strcpy(VAR,GetVarTypeName(GlobalVars[i].VarType));
strcpy(VAR,rpad(VAR,7));
fprintf(Outfile,"%s%s%s%s%s%s%s\n",Storage,VAR," ",P,VarName,VarDim,";");
}
break;
}
}
}
}
fprintf(Outfile,"%s\n","");
}
if(Use_Overloaded)
{
fprintf(Outfile,"%s\n","// *************************************************");
fprintf(Outfile,"%s\n","// User's Overloaded Subs/Functions ");
fprintf(Outfile,"%s\n","// *************************************************");
if((FP8=fopen(ovrFile,"r"))==0)
{
fprintf(stderr,"Can't open file %s\n",ovrFile);
exit(1);
}
while(!EoF(FP8))
{
ZZ[0]=0;
AR_fgets_retval=fgets(ZZ,65535,FP8);
if(ZZ[strlen(ZZ)-1]==10)ZZ[strlen(ZZ)-1]=0;
if(instr_b(ZZ,"overloaded"))
{
fprintf(Outfile,"%s\n","\n");
}
fprintf(Outfile,"%s\n",ZZ);
}
if(FP8)
{
fclose(FP8);
FP8=NULL;
}
fprintf(Outfile,"%s\n","\n\n");
}
if((FP5=fopen(setFile,"r"))==0)
{
fprintf(stderr,"Can't open file %s\n",setFile);
exit(1);
}
if(lof(setFile)>0)
{
fprintf(Outfile,"%s\n","// *************************************************");
fprintf(Outfile,"%s\n","// User GLOBAL SET Statements");
fprintf(Outfile,"%s\n","// *************************************************");
fprintf(Outfile,"%s\n","");
while(!EoF(FP5))
{
Z[0]=0;
AR_fgets_retval=fgets(Z,65535,FP5);
if(Z[strlen(Z)-1]==10)Z[strlen(Z)-1]=0;
fprintf(Outfile,"%s\n",Z);
}
fprintf(Outfile,"%s\n","");
}
if(FP5)
{
fclose(FP5);
FP5=NULL;
}
if(Use_SingleFile==FALSE)
{
if(fpHFile)
{
fclose(fpHFile);
fpHFile=NULL;
}
}
if(NoMain==0)
{
fprintf(Outfile,"%s\n","// *************************************************");
fprintf(Outfile,"%s%s\n","// ",BCX_STR_MAIN_PROG);
fprintf(Outfile,"%s\n","// *************************************************");
fprintf(Outfile,"%s\n","");
}
if(NoMain==FALSE)
{
fprintf(Outfile,"%s\n",SaveMain);
fprintf(Outfile,"%s\n","{");
fprintf(Outfile,"%s\n"," G_argc = argc;");
fprintf(Outfile,"%s\n"," G_argv = argv;");
BumpUp();
}
while(!EoF(FP1))
{
ZZ[0]=0;
AR_fgets_retval=fgets(ZZ,65535,FP1);
if(ZZ[strlen(ZZ)-1]==10)ZZ[strlen(ZZ)-1]=0;
fprintf(Outfile,"%s%s\n",Scoot,ZZ);
}
if(Use_SingleFile==TRUE)
{
RunTimeFunctions();
}
fflush(Outfile);
CloseAll();
remove (FileOut);
rename ("$t$e$m$p",FileOut);
if(ZZ)free(ZZ);
}
void RunTimeFunctions (void)
{
static char X1[2048];
memset(&X1,0,sizeof(X1));
static char O1[2048];
memset(&O1,0,sizeof(O1));
static char D1[2048];
memset(&D1,0,sizeof(D1));
static char D2[2048];
memset(&D2,0,sizeof(D2));
static char T0[2048];
memset(&T0,0,sizeof(T0));
static char T1[2048];
memset(&T1,0,sizeof(T1));
static char T2[2048];
memset(&T2,0,sizeof(T2));
static char T3[2048];
memset(&T3,0,sizeof(T3));
static char T4[2048];
memset(&T4,0,sizeof(T4));
static char T5[2048];
memset(&T5,0,sizeof(T5));
static char T6[2048];
memset(&T6,0,sizeof(T6));
static char T7[2048];
memset(&T7,0,sizeof(T7));
static char T8[2048];
memset(&T8,0,sizeof(T8));
static char T9[2048];
memset(&T9,0,sizeof(T9));
static char T10[2048];
memset(&T10,0,sizeof(T10));
static char T11[2048];
memset(&T11,0,sizeof(T11));
static char T12[2048];
memset(&T12,0,sizeof(T12));
static char T13[2048];
memset(&T13,0,sizeof(T13));
static char TDIR[2048];
memset(&TDIR,0,sizeof(TDIR));
strcpy(D1,vchr(8,34,37,32,46,49,53,71,34));
strcpy(D2,vchr(9,34,37,32,46,49,57,76,71,34));
strcpy(O1,vchr(4,34,37,111,34));
strcpy(T0,vchr(10,34,37,72,58,37,77,58,37,83,34));
strcpy(T1,vchr(4,34,37,72,34));
strcpy(T2,vchr(4,34,37,77,34));
strcpy(T3,vchr(4,34,37,83,34));
strcpy(T4,vchr(4,34,37,112,34));
strcpy(T5,vchr(4,34,37,89,34));
strcpy(T6,vchr(4,34,37,109,34));
strcpy(T7,vchr(4,34,37,100,34));
strcpy(T8,vchr(4,34,37,65,34));
strcpy(T9,vchr(4,34,37,119,34));
strcpy(T10,vchr(4,34,37,106,34));
strcpy(T11,vchr(4,34,37,86,34));
strcpy(T12,vchr(10,34,37,109,47,37,100,47,37,121,34));
strcpy(T13,vchr(15,34,37,65,44,32,37,66,32,37,100,44,32,37,89,34));
strcpy(X1,vchr(4,34,37,88,34));
strcpy(TDIR,enc("/tmp/mbc.XXXXXXXX"));
fprintf(Outfile,"%s\n","");
fprintf(Outfile,"%s\n","// *************************************************");
fprintf(Outfile,"%s%s\n","// ",BCX_STR_RUNTIME);
fprintf(Outfile,"%s\n","// *************************************************");
fprintf(Outfile,"%s\n","");
if(NoRT==TRUE)
{
return;
}
if(UseFlag)
{
if(Use_Turbo)
{
fprintf(Outfile,"%s\n","char *BCX_TmpStr (size_t Bites)");
fprintf(Outfile,"%s\n","{");
fprintf(Outfile,"%s\n"," static int StrCnt;");
fprintf(Outfile,"%s%d%s\n"," static char *StrFunc[",(int)TurboSize,"];");
fprintf(Outfile,"%s%d%s\n"," StrCnt=((StrCnt+1) &",(int)TurboSize-1,");");
fprintf(Outfile,"%s\n"," #if defined BCX_MAX_VAR_SIZE");
fprintf(Outfile,"%s\n"," if(Bites*sizeof(char)>BCX_MAX_VAR_SIZE)");
fprintf(Outfile,"%s\n"," {");
fprintf(Outfile,"%s%s%s\n"," printf(",enc("Buffer Overflow caught in BCX_TmpStr - requested space of %d EXCEEDS %d\\n"),",(int)(Bites*sizeof(char)),BCX_MAX_VAR_SIZE);");
fprintf(Outfile,"%s\n"," abort();");
fprintf(Outfile,"%s\n"," }");
fprintf(Outfile,"%s\n"," #endif");
fprintf(Outfile,"%s\n"," StrFunc[StrCnt]=(char*)realloc(StrFunc[StrCnt],Bites + 128);");
fprintf(Outfile,"%s\n"," return (char*)memset(StrFunc[StrCnt],0,Bites+128);");
fprintf(Outfile,"%s\n","}\n\n");
}
else
{
fprintf(Outfile,"%s\n","char *BCX_TmpStr (size_t Bites)");
fprintf(Outfile,"%s\n","{");
fprintf(Outfile,"%s\n"," static int StrCnt;");
fprintf(Outfile,"%s\n"," static char *StrFunc[65535];");
fprintf(Outfile,"%s\n"," StrCnt=(StrCnt + 1) & 65535;");
fprintf(Outfile,"%s\n"," if(StrFunc[StrCnt]) free (StrFunc[StrCnt]);");
fprintf(Outfile,"%s\n"," #if defined BCX_MAX_VAR_SIZE");
fprintf(Outfile,"%s\n"," if(Bites*sizeof(char)>BCX_MAX_VAR_SIZE)");
fprintf(Outfile,"%s\n"," {");
fprintf(Outfile,"%s%s%s\n"," printf(",enc("Buffer Overflow caught in BCX_TmpStr - requested space of %d EXCEEDS %d\\n"),",(int)(Bites*sizeof(char)),BCX_MAX_VAR_SIZE);");
fprintf(Outfile,"%s\n"," abort();");
fprintf(Outfile,"%s\n"," }");
fprintf(Outfile,"%s\n"," #endif");
fprintf(Outfile,"%s\n"," return StrFunc[StrCnt]=(char*)calloc(Bites+128,sizeof(char));");
fprintf(Outfile,"%s\n","}\n\n");
}
}
if(Use_CopyFile)
{
fprintf(Outfile,"%s\n","void CopyFile (char *InFile,char *TmpFile,int OverWrite)");
fprintf(Outfile,"%s\n","{");
fprintf(Outfile,"%s\n"," #define BLOCKCOPYSIZE (10 * 1000*1024)");
fprintf(Outfile,"%s\n"," char* tmp=0;");
fprintf(Outfile,"%s\n"," UINT blocks=1;");
fprintf(Outfile,"%s\n"," UINT overage=0;");
fprintf(Outfile,"%s\n"," UINT i;");
fprintf(Outfile,"%s\n"," FILE *FP1,*FP2;");
fprintf(Outfile,"%s\n"," if(!OverWrite)");
fprintf(Outfile,"%s\n"," {");
fprintf(Outfile,"%s\n"," if(Exist(TmpFile)) return;");
fprintf(Outfile,"%s\n"," }");
fprintf(Outfile,"%s\n"," if(Exist(InFile))");
fprintf(Outfile,"%s\n"," {");
fprintf(Outfile,"%s\n"," UINT length = lof(InFile);");
fprintf(Outfile,"%s\n"," if(length > BLOCKCOPYSIZE)");
fprintf(Outfile,"%s\n"," {");
fprintf(Outfile,"%s\n"," blocks = length/BLOCKCOPYSIZE;");
fprintf(Outfile,"%s\n"," overage= length % BLOCKCOPYSIZE;");
fprintf(Outfile,"%s\n"," length = BLOCKCOPYSIZE;");
fprintf(Outfile,"%s\n"," }");
fprintf(Outfile,"%s\n","");
fprintf(Outfile,"%s\n"," tmp=(char*)calloc(16+length,1);");
fprintf(Outfile,"%s\n","");
fprintf(Outfile,"%s%s%s\n"," if((FP1=fopen(InFile,",enc("rb"),"))==0)");
fprintf(Outfile,"%s\n"," {");
fprintf(Outfile,"%s%s%s\n"," fprintf(stderr,",enc("Can't open file %s\\n"),",InFile);");
fprintf(Outfile,"%s\n"," exit(1);");
fprintf(Outfile,"%s\n"," }");
fprintf(Outfile,"%s%s%s\n"," if((FP2=fopen(TmpFile,",enc("wb+"),"))==0)");
fprintf(Outfile,"%s\n"," {");
fprintf(Outfile,"%s%s%s\n"," fprintf(stderr,",enc("Can't open file %s\\n"),",TmpFile);");
fprintf(Outfile,"%s\n"," exit(1);");
fprintf(Outfile,"%s\n"," }");
fprintf(Outfile,"%s\n"," for(i=0; i<blocks; i+=1)");
fprintf(Outfile,"%s\n"," {");
fprintf(Outfile,"%s\n"," fread(tmp,1,length,FP1);");
fprintf(Outfile,"%s\n"," fwrite(tmp,1,length,FP2);");
fprintf(Outfile,"%s\n"," }");
fprintf(Outfile,"%s\n"," if(overage>0)");
fprintf(Outfile,"%s\n"," {");
fprintf(Outfile,"%s\n"," fread(tmp,1,overage,FP1);");
fprintf(Outfile,"%s\n"," fwrite(tmp,1,overage,FP2);");
fprintf(Outfile,"%s\n"," }");
fprintf(Outfile,"%s\n"," fclose(FP2); fclose(FP1);");
fprintf(Outfile,"%s\n"," if(tmp) free(tmp);");
fprintf(Outfile,"%s\n"," struct stat st;");
fprintf(Outfile,"%s\n"," if(stat(InFile, &st) != -1)");
fprintf(Outfile,"%s\n"," chmod(TmpFile,st.st_mode);");
fprintf(Outfile,"%s\n"," }");
fprintf(Outfile,"%s\n","}\n\n");
}
if(Use_Str_Cmp)
{
fprintf(Outfile,"%s\n","int str_cmp (char *a, char *b)");
fprintf(Outfile,"%s\n","{");
fprintf(Outfile,"%s\n"," int counter=0;");
fprintf(Outfile,"%s\n"," for(;;)");
fprintf(Outfile,"%s\n"," {");
fprintf(Outfile,"%s\n"," if((a[counter]^b[counter]))");
fprintf(Outfile,"%s\n"," {");
fprintf(Outfile,"%s\n"," if((UINT) a[counter]>= (UINT) b[counter])");
fprintf(Outfile,"%s\n"," return 1;");
fprintf(Outfile,"%s\n"," return -1;");
fprintf(Outfile,"%s\n"," }");
fprintf(Outfile,"%s\n"," if(!a[counter]) return 0;");
fprintf(Outfile,"%s\n"," counter++;");
fprintf(Outfile,"%s\n"," }");
fprintf(Outfile,"%s\n","}\n\n");
}
if(Use_Eof)
{
fprintf(Outfile,"%s\n","int EoF (FILE* stream)");
fprintf(Outfile,"%s\n","{");
fprintf(Outfile,"%s\n"," int c, status = ((c = fgetc(stream)) == EOF);");
fprintf(Outfile,"%s\n"," ungetc(c,stream);");
fprintf(Outfile,"%s\n"," return status;");
fprintf(Outfile,"%s\n","}\n\n");
}
if(Use_Cint)
{
fprintf(Outfile,"%s\n","int Cint (double A)");
fprintf(Outfile,"%s\n","{");
fprintf(Outfile,"%s\n"," return (A >=0 ? (int)(A+0.5) : (int)(A-0.5));");
fprintf(Outfile,"%s\n","}\n\n");
}
if(Use_Clng)
{
fprintf(Outfile,"%s\n","long CLNG (double A)");
fprintf(Outfile,"%s\n","{");
fprintf(Outfile,"%s\n"," float r=.5;");
fprintf(Outfile,"%s\n"," double a=A-(long)A;");
fprintf(Outfile,"%s\n"," if(A<0) { r=-.5; a=-a; }");
fprintf(Outfile,"%s\n"," if(((long)A % 2)==0&&a<=.5)");
fprintf(Outfile,"%s\n"," return (long)A;");
fprintf(Outfile,"%s\n"," else");
fprintf(Outfile,"%s\n"," return (long)(A+r);");
fprintf(Outfile,"%s\n","}\n\n");
}
if(Use_Left)
{
fprintf(Outfile,"%s\n","char *left (char *S, int length)");
fprintf(Outfile,"%s\n","{");
fprintf(Outfile,"%s\n"," int tmplen = strlen(S);");
fprintf(Outfile,"%s\n"," if(length<1) return BCX_TmpStr(1);");
fprintf(Outfile,"%s\n"," if(length<tmplen) tmplen=length;");
fprintf(Outfile,"%s\n"," char *strtmp = BCX_TmpStr(tmplen);");
fprintf(Outfile,"%s\n"," return (char*)memcpy(strtmp,S,tmplen);");
fprintf(Outfile,"%s\n","}\n\n");
}
if(Use_Right)
{
fprintf(Outfile,"%s\n","char *right (char *S, int length)");
fprintf(Outfile,"%s\n","{");
fprintf(Outfile,"%s\n"," int tmplen = strlen(S);");
fprintf(Outfile,"%s\n"," char *BCX_RetStr = BCX_TmpStr(tmplen);");
fprintf(Outfile,"%s\n"," tmplen -= length;");
fprintf(Outfile,"%s\n"," if (tmplen<0) tmplen = 0;");
fprintf(Outfile,"%s\n"," return strcpy(BCX_RetStr, &S[tmplen]);");
fprintf(Outfile,"%s\n","}\n\n");
}
if(Use_Rpad)
{
fprintf(Outfile,"%s\n","char *rpad (char *a, int L, int c)");
fprintf(Outfile,"%s\n","{");
fprintf(Outfile,"%s\n"," char *strtmp;");
fprintf(Outfile,"%s\n"," int s = strlen(a);");
fprintf(Outfile,"%s\n"," if((L-s)<1) return a;");
fprintf(Outfile,"%s\n"," strtmp=BCX_TmpStr(L);");
fprintf(Outfile,"%s\n"," strcpy(strtmp,a);");
fprintf(Outfile,"%s\n"," memset(&strtmp[s],c,(L-s));");
fprintf(Outfile,"%s\n"," return strtmp;");
fprintf(Outfile,"%s\n","}\n\n");
}
if(Use_Lpad)
{
fprintf(Outfile,"%s\n","char *lpad (char *a, int L, int c)");
fprintf(Outfile,"%s\n","{");
fprintf(Outfile,"%s\n"," char *strtmp;");
fprintf(Outfile,"%s\n"," L=L-strlen(a);");
fprintf(Outfile,"%s\n"," if(L<1) return a;");
fprintf(Outfile,"%s\n"," strtmp = BCX_TmpStr(L);");
fprintf(Outfile,"%s\n"," memset(strtmp,c,L);");
fprintf(Outfile,"%s\n"," return strcat(strtmp,a);");
fprintf(Outfile,"%s\n","}\n\n");
}
if(Use_Mid)
{
fprintf(Outfile,"%s\n","char *mid (char *S, int start, int length)");
fprintf(Outfile,"%s\n","{");
fprintf(Outfile,"%s\n"," char *strtmp;");
fprintf(Outfile,"%s\n"," int tmplen = strlen(S);");
fprintf(Outfile,"%s\n"," if(start>tmplen||start<1) return BCX_TmpStr(1);");
fprintf(Outfile,"%s\n"," if (length<0 || length>(tmplen-start)+1)");
fprintf(Outfile,"%s\n"," length = (tmplen-start)+1;");
fprintf(Outfile,"%s\n"," strtmp = BCX_TmpStr(length);");
fprintf(Outfile,"%s\n"," return (char*)memcpy(strtmp,&S[start-1],length);");
fprintf(Outfile,"%s\n","}\n\n");
}
if(Use_Trim)
{
fprintf(Outfile,"%s\n","char *trim (char *S)");
fprintf(Outfile,"%s\n","{");
fprintf(Outfile,"%s\n"," while(*S==32 || *S==9 || *S==10 || *S==11 || *S==13)");
fprintf(Outfile,"%s\n"," S++;");
fprintf(Outfile,"%s\n"," int i = strlen(S);");
fprintf(Outfile,"%s\n"," while( i>0 && (S[i-1]==32 || S[i-1]==9 || S[i-1]==10");
fprintf(Outfile,"%s\n"," || S[i-1]==11 || S[i-1]==13))");
fprintf(Outfile,"%s\n"," i--;");
fprintf(Outfile,"%s\n"," char *strtmp=BCX_TmpStr(i);");
fprintf(Outfile,"%s\n"," return (char*)memcpy(strtmp,S,i);");
fprintf(Outfile,"%s\n","}\n\n");
}
if(Use_Ltrim)
{
fprintf(Outfile,"%s\n","char *ltrim (char *S, char c)");
fprintf(Outfile,"%s\n","{");
fprintf(Outfile,"%s\n"," if(S[0]==0) return S;");
fprintf(Outfile,"%s\n"," while((*S==32 || *S==c) && *S !=0) S++;");
fprintf(Outfile,"%s\n"," char *strtmp = BCX_TmpStr(strlen(S));");
fprintf(Outfile,"%s\n"," return strcpy(strtmp,S);");
fprintf(Outfile,"%s\n","}\n\n");
}
if(Use_Rtrim)
{
fprintf(Outfile,"%s\n","char *rtrim (char *S,char c)");
fprintf(Outfile,"%s\n","{");
fprintf(Outfile,"%s\n"," if(S[0]==0) return S;");
fprintf(Outfile,"%s\n"," int i = strlen(S);");
fprintf(Outfile,"%s\n"," while(i>0 && (S[i-1]==c || S[i-1]==32))");
fprintf(Outfile,"%s\n"," i--;");
fprintf(Outfile,"%s\n"," char *strtmp = BCX_TmpStr(i);");
fprintf(Outfile,"%s\n"," return (char*)memcpy(strtmp,S,i);");
fprintf(Outfile,"%s\n","}\n\n");
}
if(Use_Strim)
{
fprintf(Outfile,"%s\n","char *strim (char *src)");
fprintf(Outfile,"%s\n","{");
fprintf(Outfile,"%s\n"," char *strtmp = BCX_TmpStr(strlen(src));");
fprintf(Outfile,"%s\n"," char *dst = strtmp;");
fprintf(Outfile,"%s\n"," while (isspace((unsigned char)*src)) src++;");
fprintf(Outfile,"%s\n"," do");
fprintf(Outfile,"%s\n"," {");
fprintf(Outfile,"%s\n"," while (*src && !isspace((unsigned char)*src)) *dst++ = *src++;");
fprintf(Outfile,"%s\n"," if (*src)");
fprintf(Outfile,"%s\n"," {");
fprintf(Outfile,"%s\n"," *dst++ = *src++;");
fprintf(Outfile,"%s\n"," while (isspace((unsigned char)*src)) src++;");
fprintf(Outfile,"%s\n"," }");
fprintf(Outfile,"%s\n"," } while (*src);");
fprintf(Outfile,"%s\n"," if (isspace((unsigned char)*(--dst))) *dst = 0;");
fprintf(Outfile,"%s\n"," return strtmp;");
fprintf(Outfile,"%s\n","}\n\n");
}
if(Use_Command)
{
fprintf(Outfile,"%s\n","char *command (int nArg)");
fprintf(Outfile,"%s\n"," {");
fprintf(Outfile,"%s\n"," int i = 0;");
fprintf(Outfile,"%s\n"," char *retstr=BCX_TmpStr(1);");
fprintf(Outfile,"%s\n"," if(nArg < i) // return entire commandline");
fprintf(Outfile,"%s\n"," {");
fprintf(Outfile,"%s\n"," retstr = BCX_TmpStr(G_argc * 2048);");
fprintf(Outfile,"%s\n"," for(i=1; i < G_argc; i++)");
fprintf(Outfile,"%s\n"," {");
fprintf(Outfile,"%s\n"," strcat(retstr, G_argv[i]);");
fprintf(Outfile,"%s\n"," strcat(retstr, SPC);");
fprintf(Outfile,"%s\n"," }");
fprintf(Outfile,"%s\n"," }");
fprintf(Outfile,"%s\n"," else if(nArg < G_argc)");
fprintf(Outfile,"%s\n"," {");
fprintf(Outfile,"%s\n"," retstr = BCX_TmpStr(strlen(G_argv[nArg]) + 1);");
fprintf(Outfile,"%s\n"," strcpy(retstr, G_argv[nArg]);");
fprintf(Outfile,"%s\n"," }");
fprintf(Outfile,"%s\n"," return retstr;");
fprintf(Outfile,"%s\n","}\n\n");
}
if(Use_Extract)
{
fprintf(Outfile,"%s\n","char *extract (char *mane, char *match)");
fprintf(Outfile,"%s\n","{");
fprintf(Outfile,"%s\n"," char *a;");
fprintf(Outfile,"%s\n"," char *strtmp = BCX_TmpStr(strlen(mane));");
fprintf(Outfile,"%s\n"," if(*match!=0)");
fprintf(Outfile,"%s\n"," {");
fprintf(Outfile,"%s\n"," a=_strstr_(mane,match);");
fprintf(Outfile,"%s\n"," if(a) return (char*)memcpy(strtmp,mane,a-mane);");
fprintf(Outfile,"%s\n"," }");
fprintf(Outfile,"%s\n"," return strcpy(strtmp,mane);");
fprintf(Outfile,"%s\n","}\n\n");
}
if(Use_Remain)
{
fprintf(Outfile,"%s\n","char *remain (char *mane, char *mat)");
fprintf(Outfile,"%s\n","{");
fprintf(Outfile,"%s\n"," char *p = strstr(mane,mat);");
fprintf(Outfile,"%s\n"," if(p)");
fprintf(Outfile,"%s\n"," {");
fprintf(Outfile,"%s\n"," p+=(strlen(mat));");
fprintf(Outfile,"%s\n"," return p;");
fprintf(Outfile,"%s\n"," }");
fprintf(Outfile,"%s\n"," return mane;");
fprintf(Outfile,"%s\n","}\n\n");
}
if(Use_Replace)
{
fprintf(Outfile,"%s\n","char *replace (char *src, char *pat, char *rep)");
fprintf(Outfile,"%s\n","{");
fprintf(Outfile,"%s\n"," size_t patsz, repsz, tmpsz, delta;");
fprintf(Outfile,"%s\n"," char *strtmp, *p, *q, *r;");
fprintf(Outfile,"%s\n"," if (!pat || !*pat)");
fprintf(Outfile,"%s\n"," {");
fprintf(Outfile,"%s\n"," strtmp = BCX_TmpStr(strlen(src));");
fprintf(Outfile,"%s\n"," if (!strtmp) return NULL;");
fprintf(Outfile,"%s\n"," return strcpy(strtmp, src);");
fprintf(Outfile,"%s\n"," }");
fprintf(Outfile,"%s\n"," repsz = strlen(rep);");
fprintf(Outfile,"%s\n"," patsz = strlen(pat);");
fprintf(Outfile,"%s\n"," for (tmpsz=0, p=src; (q=_strstr_(p,pat))!=0; p=q+patsz)");
fprintf(Outfile,"%s\n"," tmpsz += (size_t) (q - p) + repsz;");
fprintf(Outfile,"%s\n"," tmpsz += strlen(p);");
fprintf(Outfile,"%s\n"," strtmp = BCX_TmpStr(tmpsz);");
fprintf(Outfile,"%s\n"," if (!strtmp) return NULL;");
fprintf(Outfile,"%s\n"," for (r=strtmp,p=src; (q=_strstr_(p,pat))!=0;p=q+patsz)");
fprintf(Outfile,"%s\n"," {");
fprintf(Outfile,"%s\n"," delta = (size_t) (q-p);");
fprintf(Outfile,"%s\n"," memcpy(r,p,delta); r += delta;");
fprintf(Outfile,"%s\n"," strcpy(r,rep); r += repsz;");
fprintf(Outfile,"%s\n"," }");
fprintf(Outfile,"%s\n"," strcpy(r,p);");
fprintf(Outfile,"%s\n"," return strtmp;");
fprintf(Outfile,"%s\n","}\n\n");
}
if(Use_Reverse)
{
fprintf(Outfile,"%s\n","char *reverse (char *s)");
fprintf(Outfile,"%s\n","{");
fprintf(Outfile,"%s\n"," int j=strlen(s);");
fprintf(Outfile,"%s\n"," char *rstr = BCX_TmpStr(j);");
fprintf(Outfile,"%s\n"," while(j) rstr[--j] = *(s++);");
fprintf(Outfile,"%s\n"," return rstr;");
fprintf(Outfile,"%s\n","}\n\n");
}
if(Use_Findfirst)
{
fprintf(Outfile,"%s\n","char *findfirst (char *filespec, FILE_FIND_DATA *FindData)");
fprintf(Outfile,"%s\n","{");
fprintf(Outfile,"%s\n"," struct dirent *dp;");
fprintf(Outfile,"%s\n"," struct stat st;");
fprintf(Outfile,"%s\n","");
fprintf(Outfile,"%s\n"," if(FindData->FileHandle)");
fprintf(Outfile,"%s\n"," closedir(FindData->FileHandle);");
fprintf(Outfile,"%s\n","");
fprintf(Outfile,"%s\n"," strcpy(FindData->path, BcxSplitPath(filespec, FDRV|FPATH));");
fprintf(Outfile,"%s\n"," strcpy(FindData->cFileSpec,BcxSplitPath(filespec, FNAME|FEXT));");
fprintf(Outfile,"%s%s%s\n"," if(*FindData->path==0) strcpy(FindData->path, ",enc("."),");");
fprintf(Outfile,"%s\n","");
fprintf(Outfile,"%s\n"," FindData->FileHandle=opendir(FindData->path);");
fprintf(Outfile,"%s\n","");
fprintf(Outfile,"%s\n"," while(FindData->FileHandle)");
fprintf(Outfile,"%s\n"," {");
fprintf(Outfile,"%s\n"," dp=readdir(FindData->FileHandle);");
fprintf(Outfile,"%s\n"," if(dp==NULL) break;");
fprintf(Outfile,"%s\n","");
fprintf(Outfile,"%s\n"," if(like(dp->d_name,FindData->cFileSpec))");
fprintf(Outfile,"%s\n"," {");
fprintf(Outfile,"%s\n"," strcpy(FindData->cFileName,dp->d_name);");
fprintf(Outfile,"%s\n"," lstat(join(2,FindData->path,dp->d_name), &st);");
fprintf(Outfile,"%s\n"," FindData->dwFileAttributes = st.st_mode;");
fprintf(Outfile,"%s\n"," return FindData->cFileName;");
fprintf(Outfile,"%s\n"," }");
fprintf(Outfile,"%s\n"," }");
fprintf(Outfile,"%s\n","");
fprintf(Outfile,"%s\n"," *FindData->cFileName=0;");
fprintf(Outfile,"%s\n"," return FindData->cFileName;");
fprintf(Outfile,"%s\n","}\n\n");
}
if(Use_Findnext)
{
fprintf(Outfile,"%s\n","char *findnext (FILE_FIND_DATA *FindData)");
fprintf(Outfile,"%s\n","{");
fprintf(Outfile,"%s\n"," struct dirent *dp;");
fprintf(Outfile,"%s\n"," struct stat st;");
fprintf(Outfile,"%s\n","");
fprintf(Outfile,"%s\n"," while(FindData->FileHandle)");
fprintf(Outfile,"%s\n"," {");
fprintf(Outfile,"%s\n"," dp=readdir(FindData->FileHandle);");
fprintf(Outfile,"%s\n"," if(dp==NULL) break;");
fprintf(Outfile,"%s\n","");
fprintf(Outfile,"%s\n"," if(like(dp->d_name,FindData->cFileSpec))");
fprintf(Outfile,"%s\n"," {");
fprintf(Outfile,"%s\n"," strcpy(FindData->cFileName,dp->d_name);");
fprintf(Outfile,"%s\n"," lstat(join(2,FindData->path,dp->d_name), &st);");
fprintf(Outfile,"%s\n"," FindData->dwFileAttributes = st.st_mode;");
fprintf(Outfile,"%s\n"," return FindData->cFileName;");
fprintf(Outfile,"%s\n"," }");
fprintf(Outfile,"%s\n"," }");
fprintf(Outfile,"%s\n","");
fprintf(Outfile,"%s\n"," *FindData->cFileName=0;");
fprintf(Outfile,"%s\n"," return FindData->cFileName;");
fprintf(Outfile,"%s\n","}\n\n");
}
if(Use_Ucase)
{
fprintf(Outfile,"%s\n","char *ucase (char *S)");
fprintf(Outfile,"%s\n","{");
fprintf(Outfile,"%s\n"," char *strtmp = BCX_TmpStr(strlen(S));");
fprintf(Outfile,"%s\n"," return _strupr_(strcpy(strtmp,S));");
fprintf(Outfile,"%s\n","}\n\n");
}
if(Use_Lcase)
{
fprintf(Outfile,"%s\n","char *lcase (char *S)");
fprintf(Outfile,"%s\n","{");
fprintf(Outfile,"%s\n"," char *strtmp = BCX_TmpStr(strlen(S));");
fprintf(Outfile,"%s\n"," return _strlwr_(strcpy(strtmp,S));");
fprintf(Outfile,"%s\n","}\n\n");
}
if(Use_Mcase)
{
fprintf(Outfile,"%s\n","char *mcase (char *S)");
fprintf(Outfile,"%s\n","{");
fprintf(Outfile,"%s\n"," char *strtmp = BCX_TmpStr(strlen(S)+1);");
fprintf(Outfile,"%s\n"," char *s = strtmp;");
fprintf(Outfile,"%s\n"," _strlwr_(strcpy(strtmp,S));");
fprintf(Outfile,"%s\n"," while(*s)");
fprintf(Outfile,"%s\n"," {");
fprintf(Outfile,"%s\n"," if(islower(*s))");
fprintf(Outfile,"%s\n"," {");
fprintf(Outfile,"%s\n"," *s-=32;");
fprintf(Outfile,"%s\n"," while(isalpha(*++s));");
fprintf(Outfile,"%s\n"," }");
fprintf(Outfile,"%s\n"," s++;");
fprintf(Outfile,"%s\n"," }");
fprintf(Outfile,"%s\n"," return strtmp;");
fprintf(Outfile,"%s\n","}\n\n");
}
if(Use_Remove)
{
fprintf(Outfile,"%s\n","char *RemoveStr (char *a, char *b)");
fprintf(Outfile,"%s\n","{");
fprintf(Outfile,"%s\n"," char *strtmp, *p, *d;");
fprintf(Outfile,"%s\n"," int tmplen;");
fprintf(Outfile,"%s\n"," strtmp = d = BCX_TmpStr(strlen(a));");
fprintf(Outfile,"%s\n"," if(!b || !*b) return strcpy(strtmp,a);");
fprintf(Outfile,"%s\n"," p=_strstr_(a,b); tmplen = strlen(b);");
fprintf(Outfile,"%s\n"," while(p)");
fprintf(Outfile,"%s\n"," {");
fprintf(Outfile,"%s\n"," memcpy(d,a,p-a);");
fprintf(Outfile,"%s\n"," d+= (p-a);");
fprintf(Outfile,"%s\n"," a=p+tmplen;");
fprintf(Outfile,"%s\n"," p=_strstr_(a,b);");
fprintf(Outfile,"%s\n"," }");
fprintf(Outfile,"%s\n"," strcpy(d,a);");
fprintf(Outfile,"%s\n"," return strtmp;");
fprintf(Outfile,"%s\n","}\n\n");
}
if(Use_IRemove)
{
fprintf(Outfile,"%s\n","char *IRemoveStr (char *a, char *b)");
fprintf(Outfile,"%s\n","{");
fprintf(Outfile,"%s\n"," char *strtmp, *p, *d;");
fprintf(Outfile,"%s\n"," int tmplen;");
fprintf(Outfile,"%s\n"," strtmp = d = BCX_TmpStr(strlen(a));");
fprintf(Outfile,"%s\n"," if(!b || !*b) return strcpy(strtmp,a);");
fprintf(Outfile,"%s\n"," p=_stristr_(a,b); tmplen = strlen(b);");
fprintf(Outfile,"%s\n"," while(p)");
fprintf(Outfile,"%s\n"," {");
fprintf(Outfile,"%s\n"," memcpy(d,a,p-a);");
fprintf(Outfile,"%s\n"," d+= (p-a);");
fprintf(Outfile,"%s\n"," a=p+tmplen;");
fprintf(Outfile,"%s\n"," p=_stristr_(a,b);");
fprintf(Outfile,"%s\n"," }");
fprintf(Outfile,"%s\n"," strcpy(d,a);");
fprintf(Outfile,"%s\n"," return strtmp;");
fprintf(Outfile,"%s\n","}\n\n");
}
if(Use_Ins)
{
fprintf(Outfile,"%s\n","char *ins (char *S, int i, char *a)");
fprintf(Outfile,"%s\n","{");
fprintf(Outfile,"%s\n"," int j = strlen(S);");
fprintf(Outfile,"%s\n"," if(i<1 || i>j+1) return S;");
fprintf(Outfile,"%s\n"," char *strtmp = BCX_TmpStr(j + strlen(a));");
fprintf(Outfile,"%s\n"," memcpy(strtmp,S,--i);");
fprintf(Outfile,"%s\n"," strcpy(&strtmp[i],a);");
fprintf(Outfile,"%s\n"," return strcat(strtmp,&S[i]);");
fprintf(Outfile,"%s\n","}\n\n");
}
if(Use_Del)
{
fprintf(Outfile,"%s\n","char *del (char *S, int i, int j)");
fprintf(Outfile,"%s\n","{");
fprintf(Outfile,"%s\n"," int ln = strlen(S);");
fprintf(Outfile,"%s\n"," if(i<1 || i>ln) return S;");
fprintf(Outfile,"%s\n"," char *strtmp = BCX_TmpStr(ln);");
fprintf(Outfile,"%s\n"," memcpy(strtmp,S,--i);");
fprintf(Outfile,"%s\n"," return strcat(strtmp,&S[i+j]);");
fprintf(Outfile,"%s\n","}\n\n");
}
if(Use_Str)
{
fprintf(Outfile,"%s\n","char *str (double d)");
fprintf(Outfile,"%s\n","{");
fprintf(Outfile,"%s\n"," char *strtmp = BCX_TmpStr(16);");
fprintf(Outfile,"%s%s%s\n"," sprintf(strtmp,",D1,",d);");
fprintf(Outfile,"%s\n"," return strtmp;");
fprintf(Outfile,"%s\n","}\n\n");
}
if(Use_Strl)
{
fprintf(Outfile,"%s\n","char *strl (long double d)");
fprintf(Outfile,"%s\n","{");
fprintf(Outfile,"%s\n"," char *strtmp = BCX_TmpStr(27);");
fprintf(Outfile,"%s%s%s\n"," sprintf(strtmp,",D2,",d);");
fprintf(Outfile,"%s\n"," return strtmp;");
fprintf(Outfile,"%s\n","}\n\n");
}
if(Use_Curdir)
{
fprintf(Outfile,"%s\n","char *curdir (void)");
fprintf(Outfile,"%s\n","{");
fprintf(Outfile,"%s\n"," char *strtmp = BCX_TmpStr(2048);");
fprintf(Outfile,"%s\n"," char *res=getcwd(strtmp, 1024);");
fprintf(Outfile,"%s\n"," return strtmp;");
fprintf(Outfile,"%s\n","}\n\n");
}
if(Use_Hex)
{
fprintf(Outfile,"%s\n","char *hex (int a)");
fprintf(Outfile,"%s\n","{");
fprintf(Outfile,"%s\n"," char *strtmp = BCX_TmpStr(16);");
fprintf(Outfile,"%s%s%s\n"," sprintf(strtmp,",enc("%02X"),",a);");
fprintf(Outfile,"%s\n"," return strtmp;");
fprintf(Outfile,"%s\n","}\n\n");
}
if(Use_Tempdir)
{
fprintf(Outfile,"%s\n","char *tempdir (void)");
fprintf(Outfile,"%s\n","{");
fprintf(Outfile,"%s\n"," char *strtmp = BCX_TmpStr(2048);");
fprintf(Outfile,"%s%s%s\n"," if(!Exist(",enc("/tmp/mbc.compiler"),")) {");
fprintf(Outfile,"%s%s%s\n"," mkdir (",enc("/tmp/mbc.compiler"),",0755);");
fprintf(Outfile,"%s\n"," }");
fprintf(Outfile,"%s%s%s\n"," strcpy(strtmp,",enc("/tmp/mbc.compiler"),");");
fprintf(Outfile,"%s\n"," return strtmp;");
fprintf(Outfile,"%s\n","}\n\n");
}
if(Use_Sysdir)
{
fprintf(Outfile,"%s\n","char *sysdir (void)");
fprintf(Outfile,"%s\n","{");
fprintf(Outfile,"%s\n"," char *strtmp = BCX_TmpStr(2048);");
fprintf(Outfile,"%s\n"," GetSystemDirectory (strtmp,2048);");
fprintf(Outfile,"%s\n"," return strtmp;");
fprintf(Outfile,"%s\n","}\n\n");
}
if(Use_Repeat)
{
fprintf(Outfile,"%s\n","char *repeat (int count, char *a)");
fprintf(Outfile,"%s\n","{");
fprintf(Outfile,"%s\n"," char *strtmp = BCX_TmpStr((1+count)*strlen(a));");
fprintf(Outfile,"%s\n"," while(count-->0) strtmp = strcat(strtmp, a);");
fprintf(Outfile,"%s\n"," return strtmp;");
fprintf(Outfile,"%s\n","}\n\n");
}
if(Use_String)
{
fprintf(Outfile,"%s\n","char *stringx (int count, int a)");
fprintf(Outfile,"%s\n","{");
fprintf(Outfile,"%s\n"," if(count<1) return BCX_TmpStr(1);");
fprintf(Outfile,"%s\n"," char *strtmp = BCX_TmpStr(count);");
fprintf(Outfile,"%s\n"," return (char*)memset(strtmp,a,count);");
fprintf(Outfile,"%s\n","}\n\n");
}
if(Use_Shell)
{
fprintf(Outfile,"%s\n","void Shell (char *cmd)");
fprintf(Outfile,"%s\n","{");
fprintf(Outfile,"%s\n"," int res=system(cmd);");
fprintf(Outfile,"%s\n","}\n\n");
}
if(Use_Space)
{
fprintf(Outfile,"%s\n","char *space (int count)");
fprintf(Outfile,"%s\n","{");
fprintf(Outfile,"%s\n"," if(count<1) return BCX_TmpStr(1);");
fprintf(Outfile,"%s\n"," char *strtmp = BCX_TmpStr(count);");
fprintf(Outfile,"%s\n"," return (char*)memset(strtmp,32,count);");
fprintf(Outfile,"%s\n","}\n\n");
}
if(Use_Time)
{
fprintf(Outfile,"%s\n","char *timef (int t)");
fprintf(Outfile,"%s\n","{");
fprintf(Outfile,"%s\n"," time_t elapse_time;");
fprintf(Outfile,"%s\n"," struct tm *tp;");
fprintf(Outfile,"%s\n"," char *strtmp = BCX_TmpStr(256);");
fprintf(Outfile,"%s\n"," time (&elapse_time);");
fprintf(Outfile,"%s\n"," tp = localtime(&elapse_time);");
fprintf(Outfile,"%s\n"," switch (t)");
fprintf(Outfile,"%s\n"," {");
fprintf(Outfile,"%s\n"," case 0:");
fprintf(Outfile,"%s%s%s\n"," strftime(strtmp,256,",T0,",tp); break;");
fprintf(Outfile,"%s\n"," case 1:");
fprintf(Outfile,"%s%s%s\n"," strftime(strtmp,256,",T1,",tp); break;");
fprintf(Outfile,"%s\n"," case 2:");
fprintf(Outfile,"%s%s%s\n"," strftime(strtmp,256,",T2,",tp); break;");
fprintf(Outfile,"%s\n"," case 3:");
fprintf(Outfile,"%s%s%s\n"," strftime(strtmp,256,",T3,",tp); break;");
fprintf(Outfile,"%s\n"," case 4:");
fprintf(Outfile,"%s%s%s\n"," strftime(strtmp,256,",T4,",tp); break;");
fprintf(Outfile,"%s\n"," case 5:");
fprintf(Outfile,"%s%s%s\n"," strftime(strtmp,256,",T5,",tp); break;");
fprintf(Outfile,"%s\n"," case 6:");
fprintf(Outfile,"%s%s%s\n"," strftime(strtmp,256,",T6,",tp); break;");
fprintf(Outfile,"%s\n"," case 7:");
fprintf(Outfile,"%s%s%s\n"," strftime(strtmp,256,",T7,",tp); break;");
fprintf(Outfile,"%s\n"," case 8:");
fprintf(Outfile,"%s%s%s\n"," strftime(strtmp,256,",T8,",tp); break;");
fprintf(Outfile,"%s\n"," case 9:");
fprintf(Outfile,"%s%s%s\n"," strftime(strtmp,256,",T9,",tp); break;");
fprintf(Outfile,"%s\n"," case 10:");
fprintf(Outfile,"%s%s%s\n"," strftime(strtmp,256,",T10,",tp); break;");
fprintf(Outfile,"%s\n"," case 11:");
fprintf(Outfile,"%s%s%s\n"," strftime(strtmp,256,",T11,",tp); break;");
fprintf(Outfile,"%s\n"," case 12:");
fprintf(Outfile,"%s%s%s\n"," strftime(strtmp,256,",T12,",tp); break;");
fprintf(Outfile,"%s\n"," case 13:");
fprintf(Outfile,"%s%s%s\n"," strftime(strtmp,256,",T13,",tp); break;");
fprintf(Outfile,"%s\n"," }");
fprintf(Outfile,"%s\n"," return strtmp;");
fprintf(Outfile,"%s\n","}\n\n");
}
if(Use_Enclose)
{
fprintf(Outfile,"%s\n","char *enc (char *A, int L, int R)");
fprintf(Outfile,"%s\n","{");
fprintf(Outfile,"%s\n"," char *BCX_RetStr = BCX_TmpStr(strlen(A)+3);");
fprintf(Outfile,"%s\n"," if(L==0) L=34;");
fprintf(Outfile,"%s\n"," if(R==0) R=L;");
fprintf(Outfile,"%s%s%s%s%s\n"," sprintf(BCX_RetStr,",enc("%c%s%c%s"),",L,A,R,",enc("\0"),");");
fprintf(Outfile,"%s\n"," return BCX_RetStr;");
fprintf(Outfile,"%s\n","}\n\n");
}
if(Use_Chr)
{
fprintf(Outfile,"%s\n","char *chr (int a,int b,int c,int d,int e,int f,int g,int h,int i,int j)");
fprintf(Outfile,"%s\n","{");
fprintf(Outfile,"%s\n"," char *strtmp = BCX_TmpStr(11);");
fprintf(Outfile,"%s\n"," strtmp[0] = a;");
fprintf(Outfile,"%s\n"," strtmp[1] = b;");
fprintf(Outfile,"%s\n"," strtmp[2] = c;");
fprintf(Outfile,"%s\n"," strtmp[3] = d;");
fprintf(Outfile,"%s\n"," strtmp[4] = e;");
fprintf(Outfile,"%s\n"," strtmp[5] = f;");
fprintf(Outfile,"%s\n"," strtmp[6] = g;");
fprintf(Outfile,"%s\n"," strtmp[7] = h;");
fprintf(Outfile,"%s\n"," strtmp[8] = i;");
fprintf(Outfile,"%s\n"," strtmp[9] = j;");
fprintf(Outfile,"%s\n"," strtmp[10] = 0;");
fprintf(Outfile,"%s\n"," return strtmp;");
fprintf(Outfile,"%s\n","}\n\n");
}
if(Use_VChr)
{
fprintf(Outfile,"%s\n","char *vchr(int charcount, ...)");
fprintf(Outfile,"%s\n","{");
fprintf(Outfile,"%s\n"," int c = 0, i = charcount;");
fprintf(Outfile,"%s\n"," char *s_ = BCX_TmpStr(charcount + 1);");
fprintf(Outfile,"%s\n"," va_list marker;");
fprintf(Outfile,"%s\n"," s_[i] = 0;");
fprintf(Outfile,"%s\n"," va_start(marker, charcount);");
fprintf(Outfile,"%s\n"," while(i-- > 0) s_[c++] = va_arg(marker,int);");
fprintf(Outfile,"%s\n"," va_end(marker);");
fprintf(Outfile,"%s\n"," return s_;");
fprintf(Outfile,"%s\n","}\n\n");
}
if(Use_Join)
{
fprintf(Outfile,"%s\n","char * join(int n, ...)");
fprintf(Outfile,"%s\n","{");
fprintf(Outfile,"%s\n"," int i = n, tmplen = 0;");
fprintf(Outfile,"%s\n"," char *strtmp, *s_;");
fprintf(Outfile,"%s\n","");
fprintf(Outfile,"%s\n"," va_list marker;");
fprintf(Outfile,"%s\n"," va_start(marker, n); // Initialize variable arguments");
fprintf(Outfile,"%s\n"," while(i-- > 0)");
fprintf(Outfile,"%s\n"," {");
fprintf(Outfile,"%s\n"," s_ = va_arg(marker, char *);");
fprintf(Outfile,"%s\n"," if(s_) tmplen += strlen(s_);");
fprintf(Outfile,"%s\n"," }");
fprintf(Outfile,"%s\n"," strtmp = BCX_TmpStr(tmplen);");
fprintf(Outfile,"%s\n"," va_end(marker); // Reset variable arguments");
fprintf(Outfile,"%s\n"," i = n;");
fprintf(Outfile,"%s\n"," va_start(marker, n); // Initialize variable arguments");
fprintf(Outfile,"%s\n"," while(i-- > 0)");
fprintf(Outfile,"%s\n"," {");
fprintf(Outfile,"%s\n"," s_ = va_arg(marker, char *);");
fprintf(Outfile,"%s\n"," if(s_) strcat(strtmp, s_);");
fprintf(Outfile,"%s\n"," }");
fprintf(Outfile,"%s\n"," va_end(marker); // Reset variable arguments");
fprintf(Outfile,"%s\n"," return strtmp;");
fprintf(Outfile,"%s\n","}\n\n");
}
if(Use_Environ)
{
fprintf(Outfile,"%s\n","char* Environ(char *S)");
fprintf(Outfile,"%s\n","{");
fprintf(Outfile,"%s\n"," char *strtmp, *tmp;");
fprintf(Outfile,"%s\n","");
fprintf(Outfile,"%s\n"," tmp = getenv(S);");
fprintf(Outfile,"%s\n"," if(tmp != NULL) {");
fprintf(Outfile,"%s\n"," strtmp = BCX_TmpStr(strlen(tmp)+1);");
fprintf(Outfile,"%s\n"," return strcpy(strtmp, tmp);");
fprintf(Outfile,"%s\n"," }");
fprintf(Outfile,"%s\n"," return BCX_TmpStr(1);");
fprintf(Outfile,"%s\n","}\n\n");
}
if(Use_Oct)
{
fprintf(Outfile,"%s\n","char *oct (int a)");
fprintf(Outfile,"%s\n","{");
fprintf(Outfile,"%s\n"," char *strtmp = BCX_TmpStr(2048);");
fprintf(Outfile,"%s%s%s\n"," sprintf(strtmp,",O1,",a);");
fprintf(Outfile,"%s\n"," return strtmp;");
fprintf(Outfile,"%s\n","}\n\n");
}
if(Use_Bin)
{
fprintf(Outfile,"%s\n","char* Bin(int number)");
fprintf(Outfile,"%s\n","{");
fprintf(Outfile,"%s\n"," char *strtmp = BCX_TmpStr(2048);");
fprintf(Outfile,"%s\n"," itoa(number,strtmp,2);");
fprintf(Outfile,"%s\n"," return strtmp;");
fprintf(Outfile,"%s\n","}\n\n");
}
if(Use_Pause)
{
fprintf(Outfile,"%s\n","void Pause(void)");
fprintf(Outfile,"%s\n","{");
fprintf(Outfile,"%s%s%s%s%s\n"," printf(",enc("\\n%s\\n"),",",enc("Press any key to continue . . ."),");");
fprintf(Outfile,"%s\n"," _getch_(TRUE);");
fprintf(Outfile,"%s\n","}\n\n");
}
if(Use_Keypress)
{
fprintf(Outfile,"%s\n","int keypress(void)");
fprintf(Outfile,"%s\n","{");
fprintf(Outfile,"%s\n"," return _getch_(TRUE);");
fprintf(Outfile,"%s\n","}\n\n");
}
if(Use_Inkey)
{
fprintf(Outfile,"%s\n","char* inkey(void)");
fprintf(Outfile,"%s\n","{");
fprintf(Outfile,"%s\n"," char *strtmp = BCX_TmpStr(2);");
fprintf(Outfile,"%s\n"," strtmp[0] = _getch_(FALSE);");
fprintf(Outfile,"%s\n"," if(strtmp[0] == -1) strtmp[0] = 0;");
fprintf(Outfile,"%s\n"," return strtmp;");
fprintf(Outfile,"%s\n","}\n\n");
}
if(Use_InkeyD)
{
fprintf(Outfile,"%s\n","int inkeyd(void)");
fprintf(Outfile,"%s\n","{");
fprintf(Outfile,"%s\n"," return _getch_(TRUE);");
fprintf(Outfile,"%s\n","}\n\n");
}
if(Use_Instat)
{
fprintf(Outfile,"%s\n","int kbhit(void)");
fprintf(Outfile,"%s\n","{");
fprintf(Outfile,"%s\n"," struct termios oldt, newt;");
fprintf(Outfile,"%s\n"," int ch;");
fprintf(Outfile,"%s\n"," int oldf;");
fprintf(Outfile,"%s\n"," tcgetattr(STDIN_FILENO, &oldt);");
fprintf(Outfile,"%s\n"," newt = oldt;");
fprintf(Outfile,"%s\n"," newt.c_lflag &= ~(ICANON | ECHO);");
fprintf(Outfile,"%s\n"," tcsetattr(STDIN_FILENO, TCSANOW, &newt);");
fprintf(Outfile,"%s\n"," oldf = fcntl(STDIN_FILENO, F_GETFL, 0);");
fprintf(Outfile,"%s\n"," fcntl(STDIN_FILENO, F_SETFL, oldf | O_NONBLOCK);");
fprintf(Outfile,"%s\n"," ch = getchar();");
fprintf(Outfile,"%s\n"," tcsetattr(STDIN_FILENO, TCSANOW, &oldt);");
fprintf(Outfile,"%s\n"," fcntl(STDIN_FILENO, F_SETFL, oldf);");
fprintf(Outfile,"%s\n"," if(ch != EOF)");
fprintf(Outfile,"%s\n"," {");
fprintf(Outfile,"%s\n"," ungetc(ch, stdin);");
fprintf(Outfile,"%s\n"," return 1;");
fprintf(Outfile,"%s\n"," }");
fprintf(Outfile,"%s\n"," return 0;");
fprintf(Outfile,"%s\n","}\n\n");
}
if(Use_GetCh)
{
fprintf(Outfile,"%s\n","int _getch_(int waitkey)");
fprintf(Outfile,"%s\n","{");
fprintf(Outfile,"%s\n"," struct termios initial_settings, new_settings;");
fprintf(Outfile,"%s\n"," unsigned char ch;");
fprintf(Outfile,"%s\n","");
fprintf(Outfile,"%s\n"," tcgetattr(0,&initial_settings);");
fprintf(Outfile,"%s\n"," new_settings = initial_settings;");
fprintf(Outfile,"%s\n"," new_settings.c_lflag &= ~ICANON;");
fprintf(Outfile,"%s\n"," new_settings.c_lflag &= ~ECHO;");
fprintf(Outfile,"%s\n"," new_settings.c_lflag &= ~ISIG;");
fprintf(Outfile,"%s\n"," new_settings.c_cc[VMIN] = waitkey;");
fprintf(Outfile,"%s\n"," new_settings.c_cc[VTIME] = 0;");
fprintf(Outfile,"%s\n"," tcsetattr(0, TCSANOW, &new_settings);");
fprintf(Outfile,"%s\n","");
fprintf(Outfile,"%s\n"," //read(0,&ch,1);");
fprintf(Outfile,"%s\n"," ch = getchar();");
fprintf(Outfile,"%s\n"," tcsetattr(0, TCSANOW, &initial_settings);");
fprintf(Outfile,"%s\n"," return ch;");
fprintf(Outfile,"%s\n","}\n\n");
}
if(Use_Now)
{
fprintf(Outfile,"%s\n","char *now (void)");
fprintf(Outfile,"%s\n","{");
fprintf(Outfile,"%s\n"," time_t elapse_time;");
fprintf(Outfile,"%s\n"," struct tm *tp;");
fprintf(Outfile,"%s\n"," char *strtmp = BCX_TmpStr(2048);");
fprintf(Outfile,"%s\n"," time(&elapse_time);");
fprintf(Outfile,"%s\n"," tp=localtime(&elapse_time);");
fprintf(Outfile,"%s%s%s\n"," strftime(strtmp,256,",enc("%m/%d/%y %I:%M:%S: %p"),",tp);");
fprintf(Outfile,"%s\n"," return strtmp;");
fprintf(Outfile,"%s\n","}");
}
if(Use_AppExePath)
{
fprintf(Outfile,"%s\n","char *AppExePath (void)");
fprintf(Outfile,"%s\n","{");
fprintf(Outfile,"%s\n"," char fullpath[MAX_PATH];");
fprintf(Outfile,"%s\n"," int length;");
#if defined (__APPLE__)
fprintf(Outfile,"%s\n"," pid_t pid = getpid();");
fprintf(Outfile,"%s\n"," length = proc_pidpath (pid, fullpath, sizeof(fullpath));");
#else
fprintf(Outfile,"%s%s%s\n"," length = readlink(",enc("/proc/self/exe"),", fullpath, MAX_PATH);");
#endif
fprintf(Outfile,"%s\n"," if(length < 1) return BCX_TmpStr(1);");
fprintf(Outfile,"%s\n","");
fprintf(Outfile,"%s\n"," fullpath[length] = 0;");
fprintf(Outfile,"%s\n"," return BcxSplitPath(fullpath, FDRV|FPATH);");
fprintf(Outfile,"%s\n","}\n\n");
}
if(Use_AppExeName)
{
fprintf(Outfile,"%s\n","char *AppExeName (void)");
fprintf(Outfile,"%s\n","{");
fprintf(Outfile,"%s\n"," return BcxSplitPath(G_argv[0], FNAME|FEXT);");
fprintf(Outfile,"%s\n","}\n\n");
}
if(Use_TempFileName)
{
fprintf(Outfile,"%s\n","char * TempFileName (char *dr, char *prefix)");
fprintf(Outfile,"%s\n","{");
fprintf(Outfile,"%s\n"," static unsigned int count;");
fprintf(Outfile,"%s\n"," char *f, *tmpstr = BCX_TmpStr(MAX_PATH);");
fprintf(Outfile,"%s\n"," int i, length;");
fprintf(Outfile,"%s\n","");
fprintf(Outfile,"%s\n"," if(!count) srand(time(0));");
fprintf(Outfile,"%s\n","");
fprintf(Outfile,"%s\n"," if(dr) strcpy(tmpstr, dr);");
fprintf(Outfile,"%s\n"," length = strlen(tmpstr);");
fprintf(Outfile,"%s\n"," if(length && (tmpstr[length-1] != '\\\\' && tmpstr[length-1] != '/'))");
fprintf(Outfile,"%s\n"," tmpstr[length++] = '/';");
fprintf(Outfile,"%s\n"," if(prefix) strcpy(&tmpstr[length], prefix);");
fprintf(Outfile,"%s\n"," f = &tmpstr[strlen(tmpstr)];");
fprintf(Outfile,"%s\n","");
fprintf(Outfile,"%s\n"," do {");
fprintf(Outfile,"%s\n"," count++;");
fprintf(Outfile,"%s\n"," for(i=0; i<5; i+=1)");
fprintf(Outfile,"%s\n"," {");
fprintf(Outfile,"%s\n"," do {");
fprintf(Outfile,"%s\n"," f[i]=(char)(rnd()*122);");
fprintf(Outfile,"%s\n"," }while((f[i]<65)||(f[i]>90&&f[i]<97));");
fprintf(Outfile,"%s\n"," }");
fprintf(Outfile,"%s%s%s\n"," snprintf(&f[5],3,",enc("%x"),", count);");
fprintf(Outfile,"%s\n"," } while (Exist(tmpstr));");
fprintf(Outfile,"%s\n","");
fprintf(Outfile,"%s\n"," return tmpstr;");
fprintf(Outfile,"%s\n","}\n\n");
}
if(Use_Boolstr)
{
fprintf(Outfile,"%s\n","char * BoolStr (int a)");
fprintf(Outfile,"%s\n","{");
fprintf(Outfile,"%s\n"," char *BCX_RetStr=BCX_TmpStr(5);");
fprintf(Outfile,"%s%s%s\n"," if(a) return strcpy(BCX_RetStr,",enc("True"),");");
fprintf(Outfile,"%s%s%s\n"," return strcpy(BCX_RetStr,",enc("False"),");");
fprintf(Outfile,"%s\n","}\n\n");
}
if(Use_Using)
{
fprintf(Outfile,"%s\n","char *Using (char *Mask, double Num)");
fprintf(Outfile,"%s\n","{");
fprintf(Outfile,"%s\n"," int Spaces = 0;");
fprintf(Outfile,"%s\n"," int CntDec = 0;");
fprintf(Outfile,"%s\n"," int Decimals = 0;");
fprintf(Outfile,"%s\n"," int Dollar = 0;");
fprintf(Outfile,"%s\n"," char* BCX_RetStr = BCX_TmpStr(512);");
fprintf(Outfile,"%s\n"," char Buf_1[512]={0};");
fprintf(Outfile,"%s\n"," char* p = Mask;");
fprintf(Outfile,"%s\n"," char* r;");
fprintf(Outfile,"%s\n"," int len;");
fprintf(Outfile,"%s\n","");
fprintf(Outfile,"%s\n"," while (*p)");
fprintf(Outfile,"%s\n"," {");
fprintf(Outfile,"%s\n"," if (*p == 36) Dollar++;");
fprintf(Outfile,"%s\n"," if (*p == 32) Spaces++;");
fprintf(Outfile,"%s\n"," if ((*p == 32 || *p == 35)&& CntDec) Decimals++;");
fprintf(Outfile,"%s\n"," if (*p == 46) CntDec = 1;");
fprintf(Outfile,"%s\n"," p++;");
fprintf(Outfile,"%s\n"," }");
fprintf(Outfile,"%s%s%s\n"," sprintf(Buf_1,",enc("%1.*f"),",Decimals,Num);");
fprintf(Outfile,"%s\n","");
fprintf(Outfile,"%s\n"," len = strlen(Buf_1)-Decimals-(Decimals>0?1:0);");
fprintf(Outfile,"%s\n"," r = BCX_RetStr+Dollar+Spaces;");
fprintf(Outfile,"%s\n"," p = Buf_1;");
fprintf(Outfile,"%s\n"," while (*p)");
fprintf(Outfile,"%s\n"," {");
fprintf(Outfile,"%s\n"," *r++ = *p++;");
fprintf(Outfile,"%s\n"," if (--len>2 && *(p-1) != '-' && len % 3 == 0)");
fprintf(Outfile,"%s\n"," {");
fprintf(Outfile,"%s\n"," *r++ = ',';");
fprintf(Outfile,"%s\n"," }");
fprintf(Outfile,"%s\n"," }");
fprintf(Outfile,"%s\n"," if(Dollar) BCX_RetStr[Spaces]=36;");
fprintf(Outfile,"%s\n"," if(Spaces) memset(BCX_RetStr,32,Spaces);");
fprintf(Outfile,"%s\n","");
fprintf(Outfile,"%s\n"," return BCX_RetStr;");
fprintf(Outfile,"%s\n","}\n\n");
}
if(Use_SearchPath)
{
fprintf(Outfile,"%s\n","char *SEARCHPATH (char *szFile)");
fprintf(Outfile,"%s\n","{");
fprintf(Outfile,"%s\n"," char *BCX_RetStr=BCX_TmpStr(MAX_PATH+1);");
fprintf(Outfile,"%s\n"," PCHAR lpbs=0;");
fprintf(Outfile,"%s\n"," SearchPath(0,szFile,0,MAX_PATH,BCX_RetStr,&lpbs);");
fprintf(Outfile,"%s\n"," if(lpbs) *lpbs=0;");
fprintf(Outfile,"%s\n"," return BCX_RetStr;");
fprintf(Outfile,"%s\n","}\n\n");
}
if(Use_Instrrev)
{
fprintf(Outfile,"%s\n","int InstrRev (char *s, char *p, int os, int sens)");
fprintf(Outfile,"%s\n","{");
fprintf(Outfile,"%s\n"," int sl, pl, ox;");
fprintf(Outfile,"%s\n"," int (*cmp)(const char *, const char *, size_t );");
fprintf(Outfile,"%s\n","");
fprintf(Outfile,"%s\n"," if (!s || !p) return 0;");
fprintf(Outfile,"%s\n"," sl = strlen(s); pl = strlen(p);");
fprintf(Outfile,"%s\n"," if (os > sl || sl == 0 || pl == 0 || (ox = sl - pl) < 0)");
fprintf(Outfile,"%s\n"," return 0;");
fprintf(Outfile,"%s\n","");
fprintf(Outfile,"%s\n"," if (os <= 0) ");
fprintf(Outfile,"%s\n"," os = ox ;");
fprintf(Outfile,"%s\n"," else if(os >= pl)");
fprintf(Outfile,"%s\n"," os = os - pl ;");
fprintf(Outfile,"%s\n"," else");
fprintf(Outfile,"%s\n"," return 0;");
fprintf(Outfile,"%s\n","");
fprintf(Outfile,"%s\n"," cmp = (sens ? strncasecmp : strncmp);");
fprintf(Outfile,"%s\n"," do { if (cmp(s + os , p, pl) == 0)");
fprintf(Outfile,"%s\n"," return os+1;");
fprintf(Outfile,"%s\n"," } while (os--);");
fprintf(Outfile,"%s\n"," return 0;");
fprintf(Outfile,"%s\n","}\n\n");
}
if(Use_Instr)
{
fprintf(Outfile,"%s\n","int instr_b(char* mane,char* match,int offset,int sensflag)");
fprintf(Outfile,"%s\n","{");
fprintf(Outfile,"%s\n"," char *s;");
fprintf(Outfile,"%s\n"," if (!mane || !match || ! *match || offset>(int)strlen(mane)) return 0;");
fprintf(Outfile,"%s\n"," if (sensflag)");
fprintf(Outfile,"%s\n"," s = _stristr_(offset>0 ? mane+offset-1 : mane,match);");
fprintf(Outfile,"%s\n"," else");
fprintf(Outfile,"%s\n"," s = _strstr_(offset>0 ? mane+offset-1 : mane,match);");
fprintf(Outfile,"%s\n"," return s ? (int)(s-mane)+1 : 0;");
fprintf(Outfile,"%s\n","}\n\n");
}
if(UseLCaseTbl)
{
fprintf(Outfile,"%s\n","char *MakeLCaseTbl (void)");
fprintf(Outfile,"%s\n","{");
fprintf(Outfile,"%s\n"," static char tbl[256];");
fprintf(Outfile,"%s\n"," if(!tbl['a'])");
fprintf(Outfile,"%s\n"," {");
fprintf(Outfile,"%s\n"," int i; for (i=0; i < 256; i++)");
fprintf(Outfile,"%s\n"," tbl[i] = (char)(int)tolower(i);");
fprintf(Outfile,"%s\n"," }");
fprintf(Outfile,"%s\n"," return tbl;");
fprintf(Outfile,"%s\n","}\n\n");
}
if(Use_Stristr)
{
fprintf(Outfile,"%s\n","char *_stristr_(char *String, char *Pattern)");
fprintf(Outfile,"%s\n","{");
fprintf(Outfile,"%s\n"," int mi=-1;");
fprintf(Outfile,"%s\n"," char *LowCase = MakeLCaseTbl();");
fprintf(Outfile,"%s\n"," while(Pattern[++mi])");
fprintf(Outfile,"%s\n"," {");
fprintf(Outfile,"%s\n"," if(String[mi]==0) return 0;");
fprintf(Outfile,"%s\n"," if(LowCase[(unsigned char)String[mi]]!=LowCase[(unsigned char)Pattern[mi]])");
fprintf(Outfile,"%s\n"," { String++; mi=-1; }");
fprintf(Outfile,"%s\n"," }");
fprintf(Outfile,"%s\n"," return String;");
fprintf(Outfile,"%s\n","}\n\n");
}
if(Use_StrStr)
{
fprintf(Outfile,"%s\n","char *_strstr_(char *String, char *Pattern)");
fprintf(Outfile,"%s\n","{");
fprintf(Outfile,"%s\n"," int mi=-1;");
fprintf(Outfile,"%s\n"," while(Pattern[++mi])");
fprintf(Outfile,"%s\n"," {");
fprintf(Outfile,"%s\n"," if(String[mi]==0) return 0;");
fprintf(Outfile,"%s\n"," if(String[mi]!=Pattern[mi])");
fprintf(Outfile,"%s\n"," { String++; mi=-1; }");
fprintf(Outfile,"%s\n"," }");
fprintf(Outfile,"%s\n"," return String;");
fprintf(Outfile,"%s\n","}\n\n");
}
if(Use_Inchr)
{
fprintf(Outfile,"%s\n","int inchr (char *A, char *B)");
fprintf(Outfile,"%s\n","{");
fprintf(Outfile,"%s\n"," char* C=A;");
fprintf(Outfile,"%s\n"," while(*C)");
fprintf(Outfile,"%s\n"," {");
fprintf(Outfile,"%s\n"," if(*C==*B) return C-A+1;");
fprintf(Outfile,"%s\n"," C++;");
fprintf(Outfile,"%s\n"," }");
fprintf(Outfile,"%s\n"," return 0;");
fprintf(Outfile,"%s\n","}\n\n");
}
if(Use_Asc)
{
fprintf(Outfile,"%s\n","extern int asc (char *z,int index)");
fprintf(Outfile,"%s\n","{");
fprintf(Outfile,"%s\n"," return (unsigned char) z[index];");
fprintf(Outfile,"%s\n","}\n\n");
}
if(Use_Sgn)
{
fprintf(Outfile,"%s\n","double sgn (double a)");
fprintf(Outfile,"%s\n","{");
fprintf(Outfile,"%s\n"," if(a<0) return -1;");
fprintf(Outfile,"%s\n"," if(a>0) return 1;");
fprintf(Outfile,"%s\n"," return 0;");
fprintf(Outfile,"%s\n","}\n\n");
}
if(Use_Round)
{
fprintf(Outfile,"%s\n","double Round (double n, int d)");
fprintf(Outfile,"%s\n","{");
fprintf(Outfile,"%s\n"," return (floor((n)*pow(10.0,(d))+0.5)/pow(10.0,(d)));");
fprintf(Outfile,"%s\n","}\n\n");
}
if(Use_Embed)
{
fprintf(Outfile,"%s\n","char* GetResource (int *resource)");
fprintf(Outfile,"%s\n","{");
fprintf(Outfile,"%s\n"," char *BCX_RetStr={0};");
fprintf(Outfile,"%s\n"," static char* dat;");
fprintf(Outfile,"%s\n"," memset(&dat,0,sizeof(char *));");
fprintf(Outfile,"%s\n"," dat=(char*)resource;");
fprintf(Outfile,"%s\n"," BCX_RetStr=BCX_TmpStr(strlen(dat));");
fprintf(Outfile,"%s\n"," strcpy(BCX_RetStr,dat);");
fprintf(Outfile,"%s\n"," return BCX_RetStr;");
fprintf(Outfile,"%s\n","}\n\n");
}
if(Use_Exist)
{
fprintf(Outfile,"%s\n","bool Exist (char *szFilePath)");
fprintf(Outfile,"%s\n","{");
fprintf(Outfile,"%s\n"," int retstat;");
fprintf(Outfile,"%s\n"," struct stat sb;");
fprintf(Outfile,"%s\n"," retstat = stat(szFilePath, &sb);");
fprintf(Outfile,"%s\n"," if(retstat != -1)");
fprintf(Outfile,"%s\n"," return TRUE;");
fprintf(Outfile,"%s\n"," return FALSE;");
fprintf(Outfile,"%s\n","}\n\n");
}
if(Use_Tally)
{
fprintf(Outfile,"%s\n","int tally (char *szLine, char *szChar, int sensflag)");
fprintf(Outfile,"%s\n","{");
fprintf(Outfile,"%s\n"," if(!*szChar) return 0;");
fprintf(Outfile,"%s\n"," int mlen = strlen(szChar);");
fprintf(Outfile,"%s\n"," int iCount = 0;");
fprintf(Outfile,"%s\n"," char *p = (sensflag == 0 ? _strstr_(szLine, szChar) : _stristr_(szLine, szChar));");
fprintf(Outfile,"%s\n"," while (p)");
fprintf(Outfile,"%s\n"," {");
fprintf(Outfile,"%s\n"," iCount++;");
fprintf(Outfile,"%s\n"," p+=mlen;");
fprintf(Outfile,"%s\n"," p = (sensflag == 0 ? _strstr_(p, szChar) : _stristr_(p, szChar));");
fprintf(Outfile,"%s\n"," }");
fprintf(Outfile,"%s\n"," return iCount;");
fprintf(Outfile,"%s\n","}\n\n");
}
if(Use_Timer)
{
fprintf(Outfile,"%s\n","float timer (void)");
fprintf(Outfile,"%s\n","{");
fprintf(Outfile,"%s\n"," return ((double)clock()/CLOCKS_PER_SEC);");
fprintf(Outfile,"%s\n","}\n\n");
}
if(Use_Rnd)
{
fprintf(Outfile,"%s\n","float rnd (void)");
fprintf(Outfile,"%s\n","{");
fprintf(Outfile,"%s\n"," return (float)rand()/RAND_MAX;");
fprintf(Outfile,"%s\n","}\n\n");
}
if(Use_Exp)
{
fprintf(Outfile,"%s\n","double Exp (double arg)");
fprintf(Outfile,"%s\n","{");
fprintf(Outfile,"%s\n"," return pow(2.718281828459045,arg);");
fprintf(Outfile,"%s\n","}\n\n");
}
if(Use_Randomize)
{
fprintf(Outfile,"%s\n","void randomize (unsigned int seed)");
fprintf(Outfile,"%s\n","{");
fprintf(Outfile,"%s\n"," srand(seed);");
fprintf(Outfile,"%s\n","}\n\n");
}
if(Use_Max)
{
fprintf(Outfile,"%s\n","double _MAX_ (double a, double b)");
fprintf(Outfile,"%s\n","{");
fprintf(Outfile,"%s\n"," if(a>b)");
fprintf(Outfile,"%s\n"," return a;");
fprintf(Outfile,"%s\n"," return b;");
fprintf(Outfile,"%s\n","}\n\n");
}
if(Use_Min)
{
fprintf(Outfile,"%s\n","double _MIN_ (double a, double b)");
fprintf(Outfile,"%s\n","{");
fprintf(Outfile,"%s\n"," if(a<b)");
fprintf(Outfile,"%s\n"," return a;");
fprintf(Outfile,"%s\n"," return b;");
fprintf(Outfile,"%s\n","}\n\n");
}
if(Use_Locate)
{
fprintf(Outfile,"%s\n","void locate (int row,int col,int show,int shape)");
fprintf(Outfile,"%s\n","{");
fprintf(Outfile,"%s%s%s%s%s%s%s%s%s\n"," printf(",enc("%c%s%u%s%u%s"),",27,",enc("["),",row,",enc(";"),",col,",enc("H"),");");
fprintf(Outfile,"%s\n"," // find cursor size/shape function!");
fprintf(Outfile,"%s\n","}\n\n");
}
if(Use_Cls)
{
fprintf(Outfile,"%s\n","void cls (void)");
fprintf(Outfile,"%s\n","{");
fprintf(Outfile,"%s%s%s%s%s%s%s\n"," printf(",enc("%s%s%s%s"),",ESC,",enc("[2J"),",ESC,",enc("[H"),");");
fprintf(Outfile,"%s\n","}\n\n");
}
if(Use_Color)
{
fprintf(Outfile,"%s\n","void color (int fg,int bg)");
fprintf(Outfile,"%s\n","{");
fprintf(Outfile,"%s%s%s%s%s%s%s%s%s\n"," printf(",enc("%c%s%u%s%u%s"),",27,",enc("["),",30+(fg&7),",enc(";"),",40+(bg&7),",enc("m"),");");
fprintf(Outfile,"%s\n","}\n\n");
}
if(Use_Midstr)
{
fprintf(Outfile,"%s\n","void midstr (char *src, int st, int length, char *rep)");
fprintf(Outfile,"%s\n","{");
fprintf(Outfile,"%s\n"," int srclen = strlen(src);");
fprintf(Outfile,"%s\n"," if(st>srclen++ || st<1) return;");
fprintf(Outfile,"%s\n"," int replen = strlen(rep);");
fprintf(Outfile,"%s\n"," if(replen < length || length==-1) length=replen;");
fprintf(Outfile,"%s\n"," if((st+length) > srclen) length=srclen-st;");
fprintf(Outfile,"%s\n"," memcpy(&src[st-1],rep,length);");
fprintf(Outfile,"%s\n","}\n\n");
}
if(Use_Swap)
{
fprintf(Outfile,"%s\n","void swap ( UCHAR* A, UCHAR* B, int length)");
fprintf(Outfile,"%s\n","{");
fprintf(Outfile,"%s\n"," UCHAR t;");
fprintf(Outfile,"%s\n"," while(length--)");
fprintf(Outfile,"%s\n"," {");
fprintf(Outfile,"%s\n"," t = *A;");
fprintf(Outfile,"%s\n"," *(A++) = *B;");
fprintf(Outfile,"%s\n"," *(B++) = t;");
fprintf(Outfile,"%s\n"," }");
fprintf(Outfile,"%s\n","}\n\n");
}
if(Use_Like)
{
fprintf(Outfile,"%s\n","int like (char *raw, char *pat)");
fprintf(Outfile,"%s\n","{");
fprintf(Outfile,"%s\n"," char a, b, d;");
fprintf(Outfile,"%s\n"," char *r, *p;");
fprintf(Outfile,"%s\n"," int star = 0;");
fprintf(Outfile,"%s\n"," for(;;) {");
fprintf(Outfile,"%s\n"," if ((d = *pat++)==0) return (star || !*raw);");
fprintf(Outfile,"%s\n"," else if (d == '*') star = 1;");
fprintf(Outfile,"%s\n"," else if (d == '?') { if (!*raw++) return 0; }");
fprintf(Outfile,"%s\n"," else break;");
fprintf(Outfile,"%s\n"," }");
fprintf(Outfile,"%s\n"," b = d;");
fprintf(Outfile,"%s\n"," do if ((a = *raw++) == b) {");
fprintf(Outfile,"%s\n"," r = raw;");
fprintf(Outfile,"%s\n"," p = pat;");
fprintf(Outfile,"%s\n"," do {");
fprintf(Outfile,"%s\n"," if ((d = *p++) == '*')");
fprintf(Outfile,"%s\n"," if (like(r, p - 1)) return 1;");
fprintf(Outfile,"%s\n"," else break;");
fprintf(Outfile,"%s\n"," else if (!d) {");
fprintf(Outfile,"%s\n"," if (!*r) return 1;");
fprintf(Outfile,"%s\n"," else break;");
fprintf(Outfile,"%s\n"," }");
fprintf(Outfile,"%s\n"," } while (*r++ == d || d == '?');");
fprintf(Outfile,"%s\n"," } while (star && a);");
fprintf(Outfile,"%s\n"," return 0;");
fprintf(Outfile,"%s\n","}\n\n");
}
if(Use_Lof)
{
fprintf(Outfile,"%s\n","DWORD lof (char *FileName)");
fprintf(Outfile,"%s\n","{");
fprintf(Outfile,"%s\n","");
fprintf(Outfile,"%s\n"," int retstat;");
fprintf(Outfile,"%s\n"," struct stat sb;");
fprintf(Outfile,"%s\n"," retstat = stat(FileName, &sb);");
fprintf(Outfile,"%s\n"," if(retstat != -1)");
fprintf(Outfile,"%s\n"," return sb.st_size;");
fprintf(Outfile,"%s\n"," return 0;");
fprintf(Outfile,"%s\n","}\n\n");
}
if(Use_Iif)
{
fprintf(Outfile,"%s\n","double iif (bool cond, double tp, double fp)");
fprintf(Outfile,"%s\n","{");
fprintf(Outfile,"%s\n"," if(cond) return tp;");
fprintf(Outfile,"%s\n"," return fp;");
fprintf(Outfile,"%s\n","}\n\n");
}
if(Use_sziif)
{
fprintf(Outfile,"%s\n","char * sziif (bool i, char *a, char *b)");
fprintf(Outfile,"%s\n","{");
fprintf(Outfile,"%s\n"," if(i) return a;");
fprintf(Outfile,"%s\n"," return b;");
fprintf(Outfile,"%s\n","}\n\n");
}
if(Use_DynamicA)
{
fprintf(Outfile,"%s\n","void *CreateArr(void *a, int elem_size, int update, int num_dims, ... )");
fprintf(Outfile,"%s\n","{");
fprintf(Outfile,"%s\n"," va_list ap;");
fprintf(Outfile,"%s\n"," void *RetPtr;");
fprintf(Outfile,"%s\n","");
fprintf(Outfile,"%s\n"," va_start(ap, num_dims);");
fprintf(Outfile,"%s\n"," RetPtr = CreateArr_internal(a, elem_size, update, num_dims, ap);");
fprintf(Outfile,"%s\n"," va_end(ap);");
fprintf(Outfile,"%s\n"," return (RetPtr);");
fprintf(Outfile,"%s\n","}\n\n");
fprintf(Outfile,"%s\n","void *CreateArr_internal(void *a, int elem_size, int update, int num_dims, va_list ap)");
fprintf(Outfile,"%s\n","{");
fprintf(Outfile,"%s\n"," size_t s, s1, s2;");
fprintf(Outfile,"%s\n"," void **vp;");
fprintf(Outfile,"%s\n"," va_list marker;");
fprintf(Outfile,"%s\n"," ");
fprintf(Outfile,"%s\n","#ifdef va_copy");
fprintf(Outfile,"%s\n"," va_copy(marker, ap);");
fprintf(Outfile,"%s\n","#else");
fprintf(Outfile,"%s\n"," marker = ap;");
fprintf(Outfile,"%s\n","#endif");
fprintf(Outfile,"%s\n"," s = va_arg(marker, size_t);");
fprintf(Outfile,"%s\n"," s2 = s + 2;");
fprintf(Outfile,"%s\n"," if(num_dims == 1)");
fprintf(Outfile,"%s\n"," {");
fprintf(Outfile,"%s\n"," if(update && a)");
fprintf(Outfile,"%s\n"," a=realloc(a,s2*elem_size);");
fprintf(Outfile,"%s\n"," else");
fprintf(Outfile,"%s\n"," a=calloc(s2,elem_size);");
fprintf(Outfile,"%s\n"," return a;");
fprintf(Outfile,"%s\n"," }");
fprintf(Outfile,"%s\n"," else");
fprintf(Outfile,"%s\n"," if(update && a)");
fprintf(Outfile,"%s\n"," {");
fprintf(Outfile,"%s\n"," s1 = 0;");
fprintf(Outfile,"%s\n"," vp = (void**)a;");
fprintf(Outfile,"%s\n"," while(*vp && s1 <= s)");
fprintf(Outfile,"%s\n"," {");
fprintf(Outfile,"%s\n"," vp++;");
fprintf(Outfile,"%s\n"," s1++;");
fprintf(Outfile,"%s\n"," }");
fprintf(Outfile,"%s\n"," if(s1 > s)");
fprintf(Outfile,"%s\n"," {");
fprintf(Outfile,"%s\n"," vp--;");
fprintf(Outfile,"%s\n"," DestroyArr(vp, num_dims, 0);");
fprintf(Outfile,"%s\n"," }");
fprintf(Outfile,"%s\n"," a=realloc(a,s2*sizeof(int));");
fprintf(Outfile,"%s\n"," s1 = 0;");
fprintf(Outfile,"%s\n"," vp = (void**)a;");
fprintf(Outfile,"%s\n"," while(*vp && s1 <= s)");
fprintf(Outfile,"%s\n"," {");
fprintf(Outfile,"%s\n"," vp++;");
fprintf(Outfile,"%s\n"," s1++;");
fprintf(Outfile,"%s\n"," }");
fprintf(Outfile,"%s\n"," while(s1 < s2)");
fprintf(Outfile,"%s\n"," {");
fprintf(Outfile,"%s\n"," *(((int *)vp)) = 0;");
fprintf(Outfile,"%s\n"," vp++;");
fprintf(Outfile,"%s\n"," s1++;");
fprintf(Outfile,"%s\n"," }");
fprintf(Outfile,"%s\n"," }");
fprintf(Outfile,"%s\n"," else");
fprintf(Outfile,"%s\n"," a=calloc(s2*sizeof(int),1);");
fprintf(Outfile,"%s\n"," vp = (void**)a;");
fprintf(Outfile,"%s\n"," if(--num_dims > 0)");
fprintf(Outfile,"%s\n"," {");
fprintf(Outfile,"%s\n"," for(s1 = 0; s1 < s; s1++)");
fprintf(Outfile,"%s\n"," {");
fprintf(Outfile,"%s\n"," vp[s1] = CreateArr_internal(vp[s1], elem_size, update, num_dims, marker);");
fprintf(Outfile,"%s\n"," }");
fprintf(Outfile,"%s\n"," }");
fprintf(Outfile,"%s\n"," return a;");
fprintf(Outfile,"%s\n","}\n\n");
fprintf(Outfile,"%s\n","void DestroyArr (void** a,int num_dims, int top_free)");
fprintf(Outfile,"%s\n","{");
fprintf(Outfile,"%s\n"," int i = 0;");
fprintf(Outfile,"%s\n"," static int s = 0;");
fprintf(Outfile,"%s\n"," if(num_dims == 1)");
fprintf(Outfile,"%s\n"," {");
fprintf(Outfile,"%s\n"," free(a);");
fprintf(Outfile,"%s\n"," return;");
fprintf(Outfile,"%s\n"," }");
fprintf(Outfile,"%s\n"," s++;");
fprintf(Outfile,"%s\n"," num_dims--; ");
fprintf(Outfile,"%s\n"," while(a[i])");
fprintf(Outfile,"%s\n"," {");
fprintf(Outfile,"%s\n"," DestroyArr((void**)a[i], num_dims, top_free);");
fprintf(Outfile,"%s\n"," if(num_dims > 1)");
fprintf(Outfile,"%s\n"," free(a[i]);");
fprintf(Outfile,"%s\n"," a[i++]=NULL;");
fprintf(Outfile,"%s\n"," }");
fprintf(Outfile,"%s\n"," s--;");
fprintf(Outfile,"%s\n"," if(s == 0 && top_free)");
fprintf(Outfile,"%s\n"," free(a);");
fprintf(Outfile,"%s\n","}\n\n");
}
if(Use_Idxqsort)
{
fprintf(Outfile,"%s\n","int IdxCompare (const void *one, const void *two)");
fprintf(Outfile,"%s\n","{");
fprintf(Outfile,"%s\n"," int *ptr1 = (int *)(one);");
fprintf(Outfile,"%s\n"," int *ptr2 = (int *)(two);");
fprintf(Outfile,"%s\n"," return strcasecmp (pppStr[Key][*ptr1],pppStr[Key][*ptr2]);");
fprintf(Outfile,"%s\n","}\n\n");
}
if(Use_IdxqsortSt)
{
fprintf(Outfile,"%s\n","int IdxCompareSt (const void* one, const void* two)");
fprintf(Outfile,"%s\n","{");
fprintf(Outfile,"%s\n","#define compare1 cmp1+(StructSize * (*(UINT *)(one)))");
fprintf(Outfile,"%s\n","#define compare2 cmp1+(StructSize * (*(UINT *)(two)))");
fprintf(Outfile,"%s\n","");
fprintf(Outfile,"%s\n"," if (Key==0)");
fprintf(Outfile,"%s\n"," return strcasecmp(compare1, compare2);");
fprintf(Outfile,"%s\n","");
fprintf(Outfile,"%s\n"," if (Key==1)");
fprintf(Outfile,"%s\n"," {");
fprintf(Outfile,"%s\n"," if (*(int*)(compare1) < *(int*)(compare2)) return -1;");
fprintf(Outfile,"%s\n"," if (*(int*)(compare1) > *(int*)(compare2)) return 1;");
fprintf(Outfile,"%s\n"," return 0;");
fprintf(Outfile,"%s\n"," }");
fprintf(Outfile,"%s\n","");
fprintf(Outfile,"%s\n"," if (Key==2)");
fprintf(Outfile,"%s\n"," {");
fprintf(Outfile,"%s\n"," if (*(double*)(compare1) < *(double*)(compare2)) return -1;");
fprintf(Outfile,"%s\n"," if (*(double*)(compare1) > *(double*)(compare2)) return 1;");
fprintf(Outfile,"%s\n"," return 0;");
fprintf(Outfile,"%s\n"," }");
fprintf(Outfile,"%s\n","");
fprintf(Outfile,"%s\n"," if (Key==3)");
fprintf(Outfile,"%s\n"," {");
fprintf(Outfile,"%s\n"," if (*(UINT*)(compare1) < *(UINT*)(compare2)) return -1;");
fprintf(Outfile,"%s\n"," if (*(UINT*)(compare1) > *(UINT*)(compare2)) return 1;");
fprintf(Outfile,"%s\n"," }");
fprintf(Outfile,"%s\n","return 0;");
fprintf(Outfile,"%s\n","}\n\n");
}
if(Use_PtrqsortSt)
{
fprintf(Outfile,"%s\n","int PtrCompareSt (const void* one, const void* two)");
fprintf(Outfile,"%s\n","{");
fprintf(Outfile,"%s\n","#define pcompare1 ((char*)(one)+OffSet)");
fprintf(Outfile,"%s\n","#define pcompare2 ((char*)(two)+OffSet)");
fprintf(Outfile,"%s\n","");
fprintf(Outfile,"%s\n"," if (Key==0)");
fprintf(Outfile,"%s\n"," return strcasecmp(pcompare1, pcompare2);");
fprintf(Outfile,"%s\n","");
fprintf(Outfile,"%s\n"," if (Key==1)");
fprintf(Outfile,"%s\n"," {");
fprintf(Outfile,"%s\n"," if (*(int*)(pcompare1) < *(int*)(pcompare2)) return -1;");
fprintf(Outfile,"%s\n"," if (*(int*)(pcompare1) > *(int*)(pcompare2)) return 1;");
fprintf(Outfile,"%s\n"," return 0;");
fprintf(Outfile,"%s\n"," }");
fprintf(Outfile,"%s\n","");
fprintf(Outfile,"%s\n"," if (Key==2)");
fprintf(Outfile,"%s\n"," {");
fprintf(Outfile,"%s\n"," if (*(double*)(pcompare1) < *(double*)(pcompare2)) return -1;");
fprintf(Outfile,"%s\n"," if (*(double*)(pcompare1) > *(double*)(pcompare2)) return 1;");
fprintf(Outfile,"%s\n"," return 0;");
fprintf(Outfile,"%s\n"," }");
fprintf(Outfile,"%s\n","");
fprintf(Outfile,"%s\n"," if (Key==3)");
fprintf(Outfile,"%s\n"," {");
fprintf(Outfile,"%s\n"," if (*(UINT*)(pcompare1) < *(UINT*)(pcompare2)) return -1;");
fprintf(Outfile,"%s\n"," if (*(UINT*)(pcompare1) > *(UINT*)(pcompare2)) return 1;");
fprintf(Outfile,"%s\n"," }");
fprintf(Outfile,"%s\n","return 0;");
fprintf(Outfile,"%s\n","}\n\n");
}
if(Use_Strqsorta)
{
fprintf(Outfile,"%s\n","int StrCompareA (const void *arg1, const void *arg2)");
fprintf(Outfile,"%s\n","{");
fprintf(Outfile,"%s\n"," char *v1 = (char*) arg1;");
fprintf(Outfile,"%s\n"," char *v2 = (char*) arg2;");
fprintf(Outfile,"%s\n"," return strcasecmp (v1,v2);");
fprintf(Outfile,"%s\n","}\n\n");
}
if(Use_Strqsortd)
{
fprintf(Outfile,"%s\n","int StrCompareD (const void *arg1, const void *arg2)");
fprintf(Outfile,"%s\n","{");
fprintf(Outfile,"%s\n"," char *v1 = (char*) arg1;");
fprintf(Outfile,"%s\n"," char *v2 = (char*) arg2;");
fprintf(Outfile,"%s\n"," return strcasecmp (v2,v1);");
fprintf(Outfile,"%s\n","}\n\n");
}
if(Use_DynStrqsorta)
{
fprintf(Outfile,"%s\n","int DynStrCompareA (const void *arg1, const void *arg2)");
fprintf(Outfile,"%s\n","{");
fprintf(Outfile,"%s\n"," char *v1 = *(char **) arg1;");
fprintf(Outfile,"%s\n"," char *v2 = *(char **) arg2;");
fprintf(Outfile,"%s\n"," return strcasecmp(v1, v2);");
fprintf(Outfile,"%s\n","}\n\n");
}
if(Use_DynStrqsortd)
{
fprintf(Outfile,"%s\n","int DynStrCompareD (const void *arg1, const void *arg2)");
fprintf(Outfile,"%s\n","{");
fprintf(Outfile,"%s\n"," char *v1 = *(char **) arg1;");
fprintf(Outfile,"%s\n"," char *v2 = *(char **) arg2;");
fprintf(Outfile,"%s\n"," return strcasecmp(v2, v1);");
fprintf(Outfile,"%s\n","}\n\n");
}
if(Use_Numqsortaint)
{
fprintf(Outfile,"%s\n","int NumCompareAint (const void *one, const void *two)");
fprintf(Outfile,"%s\n","{");
fprintf(Outfile,"%s\n"," int *ptr1 = (int *)(one);");
fprintf(Outfile,"%s\n"," int *ptr2 = (int *)(two);");
fprintf(Outfile,"%s\n"," if (*ptr1 < *ptr2) return -1;");
fprintf(Outfile,"%s\n"," else if (*ptr1 == *ptr2) return 0;");
fprintf(Outfile,"%s\n"," else return 1;");
fprintf(Outfile,"%s\n","}\n\n");
}
if(Use_Numqsortdint)
{
fprintf(Outfile,"%s\n","int NumCompareDint (const void *one, const void *two)");
fprintf(Outfile,"%s\n","{");
fprintf(Outfile,"%s\n"," int *ptr1 = (int *)(one);");
fprintf(Outfile,"%s\n"," int *ptr2 = (int *)(two);");
fprintf(Outfile,"%s\n"," if (*ptr1 > *ptr2) return -1;");
fprintf(Outfile,"%s\n"," else if (*ptr1 == *ptr2) return 0;");
fprintf(Outfile,"%s\n"," else return 1;");
fprintf(Outfile,"%s\n","}\n\n");
}
if(Use_Numqsortafloat)
{
fprintf(Outfile,"%s\n","int NumCompareAfloat (const void *one, const void *two)");
fprintf(Outfile,"%s\n","{");
fprintf(Outfile,"%s\n"," float *ptr1 = (float *)(one);");
fprintf(Outfile,"%s\n"," float *ptr2 = (float *)(two);");
fprintf(Outfile,"%s\n"," if (*ptr1 < *ptr2) return -1;");
fprintf(Outfile,"%s\n"," else if (*ptr1 == *ptr2) return 0;");
fprintf(Outfile,"%s\n"," else return 1;");
fprintf(Outfile,"%s\n","}\n\n");
}
if(Use_Numqsortdfloat)
{
fprintf(Outfile,"%s\n","int NumCompareDfloat (const void *one, const void *two)");
fprintf(Outfile,"%s\n","{");
fprintf(Outfile,"%s\n"," float *ptr1 = (float *)(one);");
fprintf(Outfile,"%s\n"," float *ptr2 = (float *)(two);");
fprintf(Outfile,"%s\n"," if (*ptr1 > *ptr2) return -1;");
fprintf(Outfile,"%s\n"," else if (*ptr1 == *ptr2) return 0;");
fprintf(Outfile,"%s\n"," else return 1;");
fprintf(Outfile,"%s\n","}\n\n");
}
if(Use_Numqsortadouble)
{
fprintf(Outfile,"%s\n","int NumCompareAdouble (const void *one, const void *two)");
fprintf(Outfile,"%s\n","{");
fprintf(Outfile,"%s\n"," double *ptr1 = (double *)(one);");
fprintf(Outfile,"%s\n"," double *ptr2 = (double *)(two);");
fprintf(Outfile,"%s\n"," if (*ptr1 < *ptr2) return -1;");
fprintf(Outfile,"%s\n"," else if (*ptr1 == *ptr2) return 0;");
fprintf(Outfile,"%s\n"," else return 1;");
fprintf(Outfile,"%s\n","}\n\n");
}
if(Use_Numqsortddouble)
{
fprintf(Outfile,"%s\n","int NumCompareDdouble (const void *one, const void *two)");
fprintf(Outfile,"%s\n","{");
fprintf(Outfile,"%s\n"," double *ptr1 = (double *)(one);");
fprintf(Outfile,"%s\n"," double *ptr2 = (double *)(two);");
fprintf(Outfile,"%s\n"," if (*ptr1 > *ptr2) return -1;");
fprintf(Outfile,"%s\n"," else if (*ptr1 == *ptr2) return 0;");
fprintf(Outfile,"%s\n"," else return 1;");
fprintf(Outfile,"%s\n","}\n\n");
}
if(Use_FillArray)
{
fprintf(Outfile,"%s\n","int fillarray(char *input, int ArrayType, int MaxCnt, void *Array)");
fprintf(Outfile,"%s\n","{");
fprintf(Outfile,"%s\n"," if(MaxCnt < 1) return -1;");
fprintf(Outfile,"%s\n"," int c = 0, cnt=-1, cnt2;");
fprintf(Outfile,"%s\n"," char A[65535];");
fprintf(Outfile,"%s\n"," int *intptr = (int *)Array;");
fprintf(Outfile,"%s\n"," float *floatptr = (float *)Array;");
fprintf(Outfile,"%s\n"," double *doubleptr = (double *)Array;");
fprintf(Outfile,"%s\n"," long double *ldoubleptr = (long double *)Array;");
fprintf(Outfile,"%s\n"," for(;;)");
fprintf(Outfile,"%s\n"," {");
fprintf(Outfile,"%s\n"," cnt2=0;");
fprintf(Outfile,"%s\n"," while(input[++cnt]!=',')");
fprintf(Outfile,"%s\n"," {");
fprintf(Outfile,"%s\n"," if(input[cnt]==0) break;");
fprintf(Outfile,"%s\n"," A[cnt2++]=input[cnt];");
fprintf(Outfile,"%s\n"," }");
fprintf(Outfile,"%s\n"," A[cnt2]=0;");
fprintf(Outfile,"%s\n"," if(cnt2==0||c==MaxCnt) break;");
fprintf(Outfile,"%s\n"," ");
fprintf(Outfile,"%s\n"," if(ArrayType==2)");
fprintf(Outfile,"%s\n"," intptr[c++] = atoi(A);");
fprintf(Outfile,"%s\n"," else if(ArrayType==3)");
fprintf(Outfile,"%s\n"," floatptr[c++] = atof(A);");
fprintf(Outfile,"%s\n"," else if(ArrayType==4)");
fprintf(Outfile,"%s\n"," doubleptr[c++] = atof(A);");
fprintf(Outfile,"%s\n"," else if(ArrayType==5)");
fprintf(Outfile,"%s\n"," ldoubleptr[c++] = atof(A);");
fprintf(Outfile,"%s\n","");
fprintf(Outfile,"%s\n"," if(input[cnt]==0) break;");
fprintf(Outfile,"%s\n"," } ");
fprintf(Outfile,"%s\n"," return (c-1);");
fprintf(Outfile,"%s\n","}\n\n");
}
if(Use_Loc)
{
fprintf(Outfile,"%s\n","int loc(FILE *fp, int fplen)");
fprintf(Outfile,"%s\n","{");
fprintf(Outfile,"%s\n"," fpos_t t;");
fprintf(Outfile,"%s\n"," fgetpos(fp, &t);");
fprintf(Outfile,"%s\n","#if defined( __POCC__ )");
fprintf(Outfile,"%s\n"," t.off %= fplen;");
fprintf(Outfile,"%s\n"," return (int)t.off;");
fprintf(Outfile,"%s\n","#else");
fprintf(Outfile,"%s\n"," t %= fplen;");
fprintf(Outfile,"%s\n"," return (int)t;");
fprintf(Outfile,"%s\n","#endif");
fprintf(Outfile,"%s\n","}\n\n");
}
if(Use_Rec)
{
fprintf(Outfile,"%s\n","int rec(FILE *fp, int fplen)");
fprintf(Outfile,"%s\n","{");
fprintf(Outfile,"%s\n"," fpos_t t;");
fprintf(Outfile,"%s\n"," fgetpos(fp, &t);");
fprintf(Outfile,"%s\n","#if defined( __POCC__ )");
fprintf(Outfile,"%s\n"," t.off /= fplen;");
fprintf(Outfile,"%s\n"," return (int)++t.off;");
fprintf(Outfile,"%s\n","#else");
fprintf(Outfile,"%s\n"," t /= fplen;");
fprintf(Outfile,"%s\n"," return (int)++t;");
fprintf(Outfile,"%s\n","#endif");
fprintf(Outfile,"%s\n","}\n\n");
}
if(Use_RecCount)
{
fprintf(Outfile,"%s\n","int reccount(FILE *fp, int fplen)");
fprintf(Outfile,"%s\n","{");
fprintf(Outfile,"%s\n"," fpos_t t;");
fprintf(Outfile,"%s\n"," fseek(fp,0,SEEK_END);");
fprintf(Outfile,"%s\n"," fgetpos(fp, &t);");
fprintf(Outfile,"%s\n","#if defined( __POCC__ )");
fprintf(Outfile,"%s\n"," t.off /= fplen;");
fprintf(Outfile,"%s\n"," return (int)t.off;");
fprintf(Outfile,"%s\n","#else");
fprintf(Outfile,"%s\n"," t /= fplen;");
fprintf(Outfile,"%s\n"," return (int)t;");
fprintf(Outfile,"%s\n","#endif");
fprintf(Outfile,"%s\n","}\n\n");
}
if(Use_Scan)
{
fprintf(Outfile,"%s\n","int scan(char *input, char *format, ... )");
fprintf(Outfile,"%s\n","{");
fprintf(Outfile,"%s\n"," int c,d ;");
fprintf(Outfile,"%s\n"," char *s_;");
fprintf(Outfile,"%s\n"," int *intptr;");
fprintf(Outfile,"%s\n"," float *floatptr;");
fprintf(Outfile,"%s\n"," double *doubleptr;");
fprintf(Outfile,"%s\n"," char A[50][65535];");
fprintf(Outfile,"%s\n"," va_list marker;");
fprintf(Outfile,"%s\n"," c = 0;");
fprintf(Outfile,"%s%s%s\n"," d = Split(A,input,",enc(","),");");
fprintf(Outfile,"%s\n"," va_start(marker, format); //Initialize arguments");
fprintf(Outfile,"%s\n"," while(d && *format)");
fprintf(Outfile,"%s\n"," {");
fprintf(Outfile,"%s\n"," if(*format == '%') format++;");
fprintf(Outfile,"%s\n"," if(*format == 's')");
fprintf(Outfile,"%s\n"," {");
fprintf(Outfile,"%s\n"," s_ = va_arg(marker, char *);");
fprintf(Outfile,"%s\n"," strcpy(s_, A[c]);");
fprintf(Outfile,"%s\n"," c++;");
fprintf(Outfile,"%s\n"," d--;");
fprintf(Outfile,"%s\n"," }");
fprintf(Outfile,"%s\n"," if(*format == 'd')");
fprintf(Outfile,"%s\n"," {");
fprintf(Outfile,"%s\n"," intptr = va_arg(marker, int *);");
fprintf(Outfile,"%s\n"," *intptr = atoi(A[c]);");
fprintf(Outfile,"%s\n"," c++;");
fprintf(Outfile,"%s\n"," d--;");
fprintf(Outfile,"%s\n"," }");
fprintf(Outfile,"%s\n"," if(*format == 'g')");
fprintf(Outfile,"%s\n"," {");
fprintf(Outfile,"%s\n"," floatptr = va_arg(marker, float *);");
fprintf(Outfile,"%s\n"," *floatptr = atof(A[c]);");
fprintf(Outfile,"%s\n"," c++;");
fprintf(Outfile,"%s\n"," d--;");
fprintf(Outfile,"%s\n"," }");
fprintf(Outfile,"%s\n"," if(*format == 'l')");
fprintf(Outfile,"%s\n"," {");
fprintf(Outfile,"%s\n"," format++;");
fprintf(Outfile,"%s\n"," doubleptr = va_arg(marker, double *);");
fprintf(Outfile,"%s\n"," *doubleptr = atof(A[c]);");
fprintf(Outfile,"%s\n"," c++;");
fprintf(Outfile,"%s\n"," d--;");
fprintf(Outfile,"%s\n"," }");
fprintf(Outfile,"%s\n"," format++;");
fprintf(Outfile,"%s\n"," }");
fprintf(Outfile,"%s\n"," va_end(marker); // Reset variable arguments");
fprintf(Outfile,"%s\n"," if(d) return(1); // More data than variables");
fprintf(Outfile,"%s\n"," if(*format == 0) return(0); // OK");
fprintf(Outfile,"%s\n"," return(-1); // More variables than data");
fprintf(Outfile,"%s\n","}\n\n");
}
if(Use_Split)
{
fprintf(Outfile,"%s\n","int Split (char Buf[][65535], char *T, char *Delim, int Flg)");
fprintf(Outfile,"%s\n","{");
fprintf(Outfile,"%s\n"," int Begin = 0;");
fprintf(Outfile,"%s\n"," int Count = 0;");
fprintf(Outfile,"%s\n"," int Quote = 0;");
fprintf(Outfile,"%s\n"," int Index,i;");
fprintf(Outfile,"%s\n"," int lenT = strlen(T);");
fprintf(Outfile,"%s\n"," char Chr34[2]={34,0};");
fprintf(Outfile,"%s\n"," for(Index=1;Index<=lenT;Index++)");
fprintf(Outfile,"%s\n"," {");
fprintf(Outfile,"%s\n"," if(instr_b(Delim,mid(T,Index,1))&&!Quote)");
fprintf(Outfile,"%s\n"," {");
fprintf(Outfile,"%s\n"," strcpy(Buf[Count],(char*)mid(T,Begin,Index-Begin));");
fprintf(Outfile,"%s\n"," if ((Flg & 2) == 0) // 0 if old version");
fprintf(Outfile,"%s\n"," Count++;");
fprintf(Outfile,"%s\n"," else");
fprintf(Outfile,"%s\n"," if (Buf[Count][0] != 0) Count++;");
fprintf(Outfile,"%s\n"," Begin=0;");
fprintf(Outfile,"%s\n"," if((Flg & 1) == 1) // 1 if true");
fprintf(Outfile,"%s\n"," strcpy(Buf[Count++],(char*)mid(T,Index,1));");
fprintf(Outfile,"%s\n"," }");
fprintf(Outfile,"%s\n"," else");
fprintf(Outfile,"%s\n"," {");
fprintf(Outfile,"%s\n"," if(strcmp(mid(T,Index,1),Chr34)==0) Quote=!Quote;");
fprintf(Outfile,"%s\n"," if(Begin==0) Begin=Index;");
fprintf(Outfile,"%s\n"," }");
fprintf(Outfile,"%s\n"," }");
fprintf(Outfile,"%s\n"," if(Begin)");
fprintf(Outfile,"%s\n"," strcpy(Buf[Count++],(char*)mid(T,Begin,Index-Begin));");
fprintf(Outfile,"%s\n"," if((Flg & 1) == 0) // 0 if false");
fprintf(Outfile,"%s\n"," for(i=0;i<Count;i++) strcpy(Buf[i],(char*)RemoveStr(Buf[i],Chr34));");
fprintf(Outfile,"%s\n"," return Count;");
fprintf(Outfile,"%s\n","}\n\n");
}
if(Use_DSplit)
{
fprintf(Outfile,"%s\n","int DSplit (PCHAR *Buf, char *T, char *Delim, int Flg)");
fprintf(Outfile,"%s\n","{");
fprintf(Outfile,"%s\n"," int Begin=0;");
fprintf(Outfile,"%s\n"," int Count=0;");
fprintf(Outfile,"%s\n"," int Quote=0;");
fprintf(Outfile,"%s\n"," int Index=0;");
fprintf(Outfile,"%s\n"," int lenT = strlen(T);");
fprintf(Outfile,"%s\n"," char Chr34[2]={34,0};");
fprintf(Outfile,"%s\n"," for(Index=1;Index<=lenT;Index++)");
fprintf(Outfile,"%s\n"," {");
fprintf(Outfile,"%s\n"," if(instr_b(Delim,mid(T,Index,1))&&!Quote)");
fprintf(Outfile,"%s\n"," {");
fprintf(Outfile,"%s\n"," strcpy(Buf[Count],(char*)mid(T,Begin,Index-Begin));");
fprintf(Outfile,"%s\n"," if ((Flg & 2) == 0) // 0 if old version");
fprintf(Outfile,"%s\n"," Count++;");
fprintf(Outfile,"%s\n"," else");
fprintf(Outfile,"%s\n"," if (Buf[Count][0] != 0) Count++;");
fprintf(Outfile,"%s\n"," Begin=0;");
fprintf(Outfile,"%s\n"," if((Flg & 1) == 1) // 1 if true");
fprintf(Outfile,"%s\n"," strcpy(Buf[Count++],(char*)mid(T,Index,1));");
fprintf(Outfile,"%s\n"," }");
fprintf(Outfile,"%s\n"," else");
fprintf(Outfile,"%s\n"," {");
fprintf(Outfile,"%s\n"," if(strcmp(mid(T,Index,1),Chr34)==0) Quote=!Quote;");
fprintf(Outfile,"%s\n"," if(Begin==0) Begin=Index;");
fprintf(Outfile,"%s\n"," }");
fprintf(Outfile,"%s\n"," }");
fprintf(Outfile,"%s\n"," if(Begin) strcpy(Buf[Count++],(char*)mid(T,Begin,Index-Begin));");
fprintf(Outfile,"%s\n"," if((Flg & 1) == 0) // 0 if false");
fprintf(Outfile,"%s\n"," for(Index=0;Index<Count;Index++) strcpy(Buf[Index],(char*)RemoveStr(Buf[Index],Chr34));");
fprintf(Outfile,"%s\n"," return Count;");
fprintf(Outfile,"%s\n","}\n\n");
}
if(Use_Bin2dec)
{
fprintf(Outfile,"%s\n","int Bin2Dec (char *cptr)");
fprintf(Outfile,"%s\n","{");
fprintf(Outfile,"%s\n"," int i, j = 0;");
fprintf(Outfile,"%s%s%s\n"," while(cptr && *cptr && strchr(",enc("01"),", *cptr))");
fprintf(Outfile,"%s\n"," {");
fprintf(Outfile,"%s\n"," i = *cptr++ - '0';");
fprintf(Outfile,"%s\n"," j <<= 1;");
fprintf(Outfile,"%s\n"," j |= (i & 0x01);");
fprintf(Outfile,"%s\n"," }");
fprintf(Outfile,"%s\n"," return(j);");
fprintf(Outfile,"%s\n","}\n\n");
}
if(Use_Hex2Dec)
{
fprintf(Outfile,"%s\n","int Hex2Dec (char *szInput)");
fprintf(Outfile,"%s\n","{");
fprintf(Outfile,"%s\n"," char ch;");
fprintf(Outfile,"%s\n"," char *dwLen = szInput+strlen(szInput);");
fprintf(Outfile,"%s\n"," char *LowCase = MakeLCaseTbl();");
fprintf(Outfile,"%s\n"," DWORD dwOut = 0;");
fprintf(Outfile,"%s\n"," while(*szInput)");
fprintf(Outfile,"%s\n"," {");
fprintf(Outfile,"%s\n"," ch = LowCase[(unsigned char)*szInput++];");
fprintf(Outfile,"%s\n"," if((ch >= 'a' && ch <= 'f') || (ch >= '0' && ch <= '9'))");
fprintf(Outfile,"%s\n"," dwOut |=((int)ch - (ch>'9' ? 'a'-10 : '0')) << ((dwLen - szInput) << 2);");
fprintf(Outfile,"%s\n"," }");
fprintf(Outfile,"%s\n"," return dwOut;");
fprintf(Outfile,"%s\n","}\n\n");
}
if(Use_Verify)
{
fprintf(Outfile,"%s\n","int Verify (char *Src, char *Allowed)");
fprintf(Outfile,"%s\n","{");
fprintf(Outfile,"%s\n"," int i, j;");
fprintf(Outfile,"%s\n"," for (i=1; i<=strlen(Src); i++)");
fprintf(Outfile,"%s\n"," {");
fprintf(Outfile,"%s\n"," j=VerifyInstr(Allowed,mid(Src,i,1));");
fprintf(Outfile,"%s\n"," if (!j) return 0;");
fprintf(Outfile,"%s\n"," }");
fprintf(Outfile,"%s\n"," return TRUE;");
fprintf(Outfile,"%s\n","}\n\n");
fprintf(Outfile,"%s\n","int VerifyInstr(char* mane,char* match,int offset)");
fprintf(Outfile,"%s\n","{");
fprintf(Outfile,"%s\n"," char *s;");
fprintf(Outfile,"%s\n"," if (!mane || !match || !*match || offset>(int)strlen(mane)) return 0;");
fprintf(Outfile,"%s\n"," s = strstr (offset>0 ? mane+offset-1 : mane,match);");
fprintf(Outfile,"%s\n"," return s ? (int)(s-mane)+1 : 0;");
fprintf(Outfile,"%s\n","}\n\n");
}
if(Use_Retain)
{
fprintf(Outfile,"%s\n","char *Retain (char *Text, char *ValidChars)");
fprintf(Outfile,"%s\n","{");
fprintf(Outfile,"%s\n"," char *BCX_RetStr=BCX_TmpStr(strlen(Text));");
fprintf(Outfile,"%s\n"," char *temp=BCX_RetStr;");
fprintf(Outfile,"%s\n"," while(*Text)");
fprintf(Outfile,"%s\n"," {");
fprintf(Outfile,"%s\n"," if(strchr(ValidChars,*Text)) *(temp++) = *Text;");
fprintf(Outfile,"%s\n"," Text++;");
fprintf(Outfile,"%s\n"," }");
fprintf(Outfile,"%s\n"," return BCX_RetStr;");
fprintf(Outfile,"%s\n","}\n\n");
}
if(Use_LoadFile)
{
fprintf(Outfile,"%s\n","char* LoadFile (char *N)");
fprintf(Outfile,"%s\n","{");
fprintf(Outfile,"%s\n"," FILE* FP1;");
fprintf(Outfile,"%s\n"," char* BCX_RetStr;");
fprintf(Outfile,"%s\n"," if(Exist(N))");
fprintf(Outfile,"%s\n"," {");
fprintf(Outfile,"%s\n"," BCX_RetStr=BCX_TmpStr(lof(N));");
fprintf(Outfile,"%s%s%s\n"," if((FP1=fopen(N,",enc("rb"),"))!=0)");
fprintf(Outfile,"%s\n"," GET(FP1,BCX_RetStr,lof(N));");
fprintf(Outfile,"%s\n"," fclose(FP1);");
fprintf(Outfile,"%s\n"," return BCX_RetStr;");
fprintf(Outfile,"%s\n"," }");
fprintf(Outfile,"%s\n"," else");
fprintf(Outfile,"%s\n"," {");
fprintf(Outfile,"%s\n"," BCX_RetStr=BCX_TmpStr(64);");
fprintf(Outfile,"%s%s%s\n"," return strcpy(BCX_RetStr,",enc("File Not Found"),");");
fprintf(Outfile,"%s\n"," }");
fprintf(Outfile,"%s\n","}\n\n");
}
if(Use_Freefile)
{
fprintf(Outfile,"%s\n","FILE* FreeFile (void)");
fprintf(Outfile,"%s\n","{");
fprintf(Outfile,"%s\n"," static FILE *pf;");
fprintf(Outfile,"%s\n"," if(pf){free(pf);pf=NULL;}");
fprintf(Outfile,"%s\n"," pf = (FILE*)calloc(sizeof(FILE*),sizeof(FILE*));");
fprintf(Outfile,"%s\n"," return pf;");
fprintf(Outfile,"%s\n","}\n\n");
}
if(Use_Run)
{
fprintf(Outfile,"%s\n","int Run (char* Cmdline, int ShowHide, int WaitState)");
fprintf(Outfile,"%s\n","{");
fprintf(Outfile,"%s\n"," int processId;");
fprintf(Outfile,"%s\n"," char *s, *p, *cmd_line;");
fprintf(Outfile,"%s\n","");
fprintf(Outfile,"%s\n"," cmd_line=(char*)malloc(strlen(Cmdline)+1);");
fprintf(Outfile,"%s\n"," if(cmd_line==NULL) return -2;");
fprintf(Outfile,"%s\n","");
fprintf(Outfile,"%s\n"," strcpy(cmd_line, Cmdline);");
fprintf(Outfile,"%s\n"," p = s = cmd_line;");
fprintf(Outfile,"%s\n"," processId=fork();");
fprintf(Outfile,"%s\n"," if(processId==0)");
fprintf(Outfile,"%s\n"," {");
fprintf(Outfile,"%s\n"," PCHAR argv[30];");
fprintf(Outfile,"%s\n"," int i=0;");
fprintf(Outfile,"%s\n"," while(*p)");
fprintf(Outfile,"%s\n"," {");
fprintf(Outfile,"%s\n"," if(*p==34)");
fprintf(Outfile,"%s\n"," {");
fprintf(Outfile,"%s\n"," while(*(++p)!=34) {}");
fprintf(Outfile,"%s\n"," }");
fprintf(Outfile,"%s\n"," if(*p==32)");
fprintf(Outfile,"%s\n"," {");
fprintf(Outfile,"%s\n"," while(*(p+1)==32) p++;");
fprintf(Outfile,"%s\n"," argv[i++]=s;");
fprintf(Outfile,"%s\n"," *p=0; s=p+1;");
fprintf(Outfile,"%s\n"," }");
fprintf(Outfile,"%s\n"," p++;");
fprintf(Outfile,"%s\n"," }");
fprintf(Outfile,"%s\n"," argv[i] = s;");
fprintf(Outfile,"%s\n"," argv[i+1]= 0;");
fprintf(Outfile,"%s\n"," execvp(argv[0],argv);");
fprintf(Outfile,"%s%s%s\n"," printf(",enc("Failed to run%s\\n"),",argv[0]);");
fprintf(Outfile,"%s\n"," exit(-1);");
fprintf(Outfile,"%s\n"," }");
fprintf(Outfile,"%s\n"," else if(processId!=-1)");
fprintf(Outfile,"%s\n"," {");
fprintf(Outfile,"%s\n"," if(WaitState) waitpid(processId,NULL,0);");
fprintf(Outfile,"%s\n"," }");
fprintf(Outfile,"%s\n"," waitpid(-1,NULL,WNOHANG);");
fprintf(Outfile,"%s\n"," free(cmd_line), cmd_line=NULL;");
fprintf(Outfile,"%s\n"," return processId;");
fprintf(Outfile,"%s\n","}\n\n");
}
if(Use_Download)
{
fprintf(Outfile,"%s\n","int Download (char *URL,char *Localname)");
fprintf(Outfile,"%s\n","{");
fprintf(Outfile,"%s\n"," int RetVal;");
fprintf(Outfile,"%s\n"," return RetVal=!RetVal;");
fprintf(Outfile,"%s\n","}\n\n");
}
if(Use_PeekStr)
{
fprintf(Outfile,"%s\n","char *peekstr (LPVOID Src, int Count)");
fprintf(Outfile,"%s\n","{");
fprintf(Outfile,"%s\n"," char *Des=BCX_TmpStr(Count);");
fprintf(Outfile,"%s\n"," memmove(Des,Src,Count);");
fprintf(Outfile,"%s\n"," return Des;");
fprintf(Outfile,"%s\n","}\n\n");
}
if(Use_QBColor)
{
fprintf(Outfile,"%s\n","int qbcolor (int N)");
fprintf(Outfile,"%s\n","{");
fprintf(Outfile,"%s\n"," switch (N)");
fprintf(Outfile,"%s\n"," {");
fprintf(Outfile,"%s\n"," case 0 : return RGB(0,0,0);");
fprintf(Outfile,"%s\n"," case 1 : return RGB(0,0,128);");
fprintf(Outfile,"%s\n"," case 2 : return RGB(0,128,0);");
fprintf(Outfile,"%s\n"," case 3 : return RGB(0,128,128);");
fprintf(Outfile,"%s\n"," case 4 : return RGB(196,0,0);");
fprintf(Outfile,"%s\n"," case 5 : return RGB(128,0,128);");
fprintf(Outfile,"%s\n"," case 6 : return RGB(128,64,0);");
fprintf(Outfile,"%s\n"," case 7 : return RGB(196,196,196);");
fprintf(Outfile,"%s\n"," case 8 : return RGB(128,128,128);");
fprintf(Outfile,"%s\n"," case 9 : return RGB(0,0, 255);");
fprintf(Outfile,"%s\n"," case 10 : return RGB(0,255,0);");
fprintf(Outfile,"%s\n"," case 11 : return RGB(0,255,255);");
fprintf(Outfile,"%s\n"," case 12 : return RGB(255,0,0);");
fprintf(Outfile,"%s\n"," case 13 : return RGB(255,0,255);");
fprintf(Outfile,"%s\n"," case 14 : return RGB(255,255,0);");
fprintf(Outfile,"%s\n"," case 15 : return RGB(255,255,255);");
fprintf(Outfile,"%s\n"," case 16 : return RGB(164,164,164);");
fprintf(Outfile,"%s\n"," case 17 : return RGB(128,160,255);");
fprintf(Outfile,"%s\n"," case 18 : return RGB(160,255,160);");
fprintf(Outfile,"%s\n"," case 19 : return RGB(160,255,255);");
fprintf(Outfile,"%s\n"," case 20 : return RGB(255,160,160);");
fprintf(Outfile,"%s\n"," case 21 : return RGB(255,160,255);");
fprintf(Outfile,"%s\n"," case 22 : return RGB(255,255,160);");
fprintf(Outfile,"%s\n"," case 23 : return RGB(212,212,212);");
fprintf(Outfile,"%s\n"," case 24 : return RGB(180,180,180);");
fprintf(Outfile,"%s\n"," case 25 : return RGB(188,220,255);");
fprintf(Outfile,"%s\n"," case 26 : return RGB(220,255,220);");
fprintf(Outfile,"%s\n"," case 27 : return RGB(220,255,255);");
fprintf(Outfile,"%s\n"," case 28 : return RGB(255,220,220);");
fprintf(Outfile,"%s\n"," case 29 : return RGB(255,220,255);");
fprintf(Outfile,"%s\n"," case 30 : return RGB(255,255,220);");
fprintf(Outfile,"%s\n"," case 31 : return RGB(228,228,228);");
fprintf(Outfile,"%s\n"," }");
fprintf(Outfile,"%s\n","return 0;");
fprintf(Outfile,"%s\n","}\n\n");
}
if(Use_Cvi)
{
fprintf(Outfile,"%s\n","short CVI (char *s)");
fprintf(Outfile,"%s\n","{");
fprintf(Outfile,"%s\n"," return ((short*)s)[0];");
fprintf(Outfile,"%s\n","}\n\n");
}
if(Use_Mki)
{
fprintf(Outfile,"%s\n","char *MKI (short cvt)");
fprintf(Outfile,"%s\n","{");
fprintf(Outfile,"%s\n"," static char temp[3];");
fprintf(Outfile,"%s\n"," return (char *)memmove(temp,&cvt,2);");
fprintf(Outfile,"%s\n","}\n\n");
}
if(Use_Cvl)
{
fprintf(Outfile,"%s\n","long CVL (char *s)");
fprintf(Outfile,"%s\n","{");
fprintf(Outfile,"%s\n"," return ((long*)s)[0];");
fprintf(Outfile,"%s\n","}\n\n");
}
if(Use_Mkl)
{
fprintf(Outfile,"%s\n","char *MKL (int cvt)");
fprintf(Outfile,"%s\n","{");
fprintf(Outfile,"%s\n"," static char temp[5];");
fprintf(Outfile,"%s\n"," return (char *) memmove(temp,&cvt,4);");
fprintf(Outfile,"%s\n","}\n\n");
}
if(Use_Cvs)
{
fprintf(Outfile,"%s\n","float CVS (char *s)");
fprintf(Outfile,"%s\n","{");
fprintf(Outfile,"%s\n"," return ((float*)s)[0];");
fprintf(Outfile,"%s\n","}\n\n");
}
if(Use_Mks)
{
fprintf(Outfile,"%s\n","char *MKS (float cvt)");
fprintf(Outfile,"%s\n","{");
fprintf(Outfile,"%s\n"," static char temp[5];");
fprintf(Outfile,"%s\n"," return (char *) memmove(temp,&cvt,4);");
fprintf(Outfile,"%s\n","}\n\n");
}
if(Use_Cvd)
{
fprintf(Outfile,"%s\n","double CVD (char *s)");
fprintf(Outfile,"%s\n","{");
fprintf(Outfile,"%s\n"," return ((double*)s)[0];");
fprintf(Outfile,"%s\n","}\n\n");
}
if(Use_Cvld)
{
fprintf(Outfile,"%s\n","long double CVLD (char *s)");
fprintf(Outfile,"%s\n","{");
fprintf(Outfile,"%s\n"," return ((long double*)s)[0];");
fprintf(Outfile,"%s\n","}\n\n");
}
if(Use_Mkd)
{
fprintf(Outfile,"%s\n","char *MKD (double cvt)");
fprintf(Outfile,"%s\n","{");
fprintf(Outfile,"%s\n"," static char temp[9];");
fprintf(Outfile,"%s\n"," return (char *) memmove(temp,&cvt,8);");
fprintf(Outfile,"%s\n","}\n\n");
}
if(Use_Mkld)
{
fprintf(Outfile,"%s\n","char *MKLD (long double cvt)");
fprintf(Outfile,"%s\n","{");
fprintf(Outfile,"%s\n"," static char temp[11];");
fprintf(Outfile,"%s\n"," return (char *) memmove(temp,&cvt,10);");
fprintf(Outfile,"%s\n","}\n\n");
}
if(Use_BcxSplitPath)
{
fprintf(Outfile,"%s\n","char *BcxSplitPath (char *FPath, int mask)");
fprintf(Outfile,"%s\n","{");
fprintf(Outfile,"%s\n"," if(!FPath) return BCX_TmpStr(1);");
fprintf(Outfile,"%s\n"," char *BCX_RetStr=BCX_TmpStr(strlen(FPath));");
fprintf(Outfile,"%s\n"," char tmp[MAX_PATH*4];");
fprintf(Outfile,"%s\n"," _splitpath_(FPath,tmp,&tmp[MAX_PATH],&tmp[MAX_PATH*2],&tmp[MAX_PATH*3]);");
fprintf(Outfile,"%s\n"," if(mask & FDRV) strcat(BCX_RetStr,tmp);");
fprintf(Outfile,"%s\n"," if(mask & FPATH)strcat(BCX_RetStr,&tmp[MAX_PATH]);");
fprintf(Outfile,"%s\n"," if(mask & FNAME)strcat(BCX_RetStr,&tmp[MAX_PATH*2]);");
fprintf(Outfile,"%s\n"," if(mask & FEXT) strcat(BCX_RetStr,&tmp[MAX_PATH*3]);");
fprintf(Outfile,"%s\n"," return BCX_RetStr;");
fprintf(Outfile,"%s\n","}\n\n");
fprintf(Outfile,"%s\n"," void _splitpath_(const char* path, char* drv, char* dir, char* name, char* ext)");
fprintf(Outfile,"%s\n"," {");
fprintf(Outfile,"%s\n"," const char* pend; /* end of processed string */");
fprintf(Outfile,"%s\n"," const char* p; /* search pointer */");
fprintf(Outfile,"%s\n"," const char* s; /* copy pointer */");
fprintf(Outfile,"%s\n"," ");
fprintf(Outfile,"%s\n"," /* extract drive name */");
fprintf(Outfile,"%s\n"," if (path[0] && path[1]==':') {");
fprintf(Outfile,"%s\n"," if (drv) {");
fprintf(Outfile,"%s\n"," *drv++ = *path++;");
fprintf(Outfile,"%s\n"," *drv++ = *path++;");
fprintf(Outfile,"%s\n"," *drv = 0;");
fprintf(Outfile,"%s\n"," }");
fprintf(Outfile,"%s\n"," } else if (drv)");
fprintf(Outfile,"%s\n"," *drv = 0;");
fprintf(Outfile,"%s\n"," ");
fprintf(Outfile,"%s\n"," /* search for end of string or stream separator */");
fprintf(Outfile,"%s\n"," for(pend=path; *pend && *pend!=':'; )");
fprintf(Outfile,"%s\n"," pend++;");
fprintf(Outfile,"%s\n"," ");
fprintf(Outfile,"%s\n"," /* search for begin of file extension */");
fprintf(Outfile,"%s\n"," for(p=pend; p > path && *--p != '\\\\' && *p!='/'; )");
fprintf(Outfile,"%s\n"," if (*p == '.') {");
fprintf(Outfile,"%s\n"," pend = p;");
fprintf(Outfile,"%s\n"," break;");
fprintf(Outfile,"%s\n"," }");
fprintf(Outfile,"%s\n"," ");
fprintf(Outfile,"%s\n"," if (ext)");
fprintf(Outfile,"%s\n"," {");
fprintf(Outfile,"%s\n"," s=pend;");
fprintf(Outfile,"%s\n"," do{ *ext++ = *s; } while(*s++);");
fprintf(Outfile,"%s\n"," }");
fprintf(Outfile,"%s\n"," /* search for end of directory name */");
fprintf(Outfile,"%s\n"," for(p=pend; p > path; )");
fprintf(Outfile,"%s\n"," if (*--p == '\\\\' || *p == '/') {");
fprintf(Outfile,"%s\n"," p++;");
fprintf(Outfile,"%s\n"," break;");
fprintf(Outfile,"%s\n"," }");
fprintf(Outfile,"%s\n"," ");
fprintf(Outfile,"%s\n"," if (name) {");
fprintf(Outfile,"%s\n"," for(s=p; s<pend; )");
fprintf(Outfile,"%s\n"," *name++ = *s++;");
fprintf(Outfile,"%s\n"," ");
fprintf(Outfile,"%s\n"," *name = 0;");
fprintf(Outfile,"%s\n"," }");
fprintf(Outfile,"%s\n"," ");
fprintf(Outfile,"%s\n"," if (dir) {");
fprintf(Outfile,"%s\n"," for(s=path; s<p; )");
fprintf(Outfile,"%s\n"," *dir++ = *s++;");
fprintf(Outfile,"%s\n"," ");
fprintf(Outfile,"%s\n"," *dir = 0;");
fprintf(Outfile,"%s\n"," }");
fprintf(Outfile,"%s\n"," }\n");
}
if(Use_StrUpLow)
{
fprintf(Outfile,"%s\n","char *_strupr_(char *string)");
fprintf(Outfile,"%s\n","{");
fprintf(Outfile,"%s\n"," char *s;");
fprintf(Outfile,"%s\n","");
fprintf(Outfile,"%s\n"," if (string)");
fprintf(Outfile,"%s\n"," {");
fprintf(Outfile,"%s\n"," for(s = string; *s; ++s)");
fprintf(Outfile,"%s\n"," *s = toupper(*s);");
fprintf(Outfile,"%s\n"," }");
fprintf(Outfile,"%s\n"," return string;");
fprintf(Outfile,"%s\n","}\n");
fprintf(Outfile,"%s\n","char *_strlwr_(char *string)");
fprintf(Outfile,"%s\n","{");
fprintf(Outfile,"%s\n"," char *s;");
fprintf(Outfile,"%s\n","");
fprintf(Outfile,"%s\n"," if (string)");
fprintf(Outfile,"%s\n"," {");
fprintf(Outfile,"%s\n"," for (s = string; *s; ++s)");
fprintf(Outfile,"%s\n"," *s = tolower(*s);");
fprintf(Outfile,"%s\n"," }");
fprintf(Outfile,"%s\n"," return string;");
fprintf(Outfile,"%s\n","}\n");
}
if(Use_Strtoken)
{
fprintf(Outfile,"%s\n","char * StrToken (char *Source, char *TokenChar, int n)");
fprintf(Outfile,"%s\n","{");
fprintf(Outfile,"%s\n"," char *BCX_RetStr={0};");
fprintf(Outfile,"%s\n"," char *RetVal;");
fprintf(Outfile,"%s\n"," char *Copy;");
fprintf(Outfile,"%s\n"," int Posn=0;");
fprintf(Outfile,"%s\n"," int Find=0;");
fprintf(Outfile,"%s\n"," int LenSrc=strlen(Source);");
fprintf(Outfile,"%s\n"," RetVal=(char*)calloc(LenSrc+1,1);");
fprintf(Outfile,"%s\n"," Copy=Source;");
fprintf(Outfile,"%s\n"," if(tally(Source,TokenChar)==0)");
fprintf(Outfile,"%s\n"," {");
fprintf(Outfile,"%s\n"," BCX_RetStr=BCX_TmpStr(1);");
fprintf(Outfile,"%s\n"," if(RetVal)free(RetVal);");
fprintf(Outfile,"%s\n"," return BCX_RetStr;");
fprintf(Outfile,"%s\n"," }");
fprintf(Outfile,"%s\n"," if(n==1)");
fprintf(Outfile,"%s\n"," {");
fprintf(Outfile,"%s\n"," BCX_RetStr=BCX_TmpStr(LenSrc);");
fprintf(Outfile,"%s\n"," strcpy(BCX_RetStr,(char*)extract(Source,TokenChar));");
fprintf(Outfile,"%s\n"," if(RetVal)free(RetVal);");
fprintf(Outfile,"%s\n"," return BCX_RetStr;");
fprintf(Outfile,"%s\n"," }");
fprintf(Outfile,"%s\n"," if(n>tally(Source,TokenChar)+1)");
fprintf(Outfile,"%s\n"," {");
fprintf(Outfile,"%s\n"," BCX_RetStr=BCX_TmpStr(1);");
fprintf(Outfile,"%s\n"," if(RetVal)free(RetVal);");
fprintf(Outfile,"%s\n"," return BCX_RetStr;");
fprintf(Outfile,"%s\n"," }");
fprintf(Outfile,"%s\n"," while(*Copy)");
fprintf(Outfile,"%s\n"," {");
fprintf(Outfile,"%s\n"," if(*Copy==TokenChar[0]) Find++;");
fprintf(Outfile,"%s\n"," if(Find==n) break;");
fprintf(Outfile,"%s\n"," Copy++;");
fprintf(Outfile,"%s\n"," Posn++;");
fprintf(Outfile,"%s\n"," }");
fprintf(Outfile,"%s\n"," if(n==tally(Source,TokenChar)+1)");
fprintf(Outfile,"%s\n"," {");
fprintf(Outfile,"%s\n"," Posn=LenSrc;");
fprintf(Outfile,"%s\n"," Copy=Source+Posn;");
fprintf(Outfile,"%s\n"," while(*Copy&&Source[Posn]!=TokenChar[0])");
fprintf(Outfile,"%s\n"," {");
fprintf(Outfile,"%s\n"," Posn--;");
fprintf(Outfile,"%s\n"," Copy--;");
fprintf(Outfile,"%s\n"," }");
fprintf(Outfile,"%s\n"," }");
fprintf(Outfile,"%s\n"," strcpy(RetVal,(char*)mid(Source,1,Posn));");
fprintf(Outfile,"%s\n"," strcpy(RetVal,(char*)mid(RetVal,InstrRev(RetVal,TokenChar)));");
fprintf(Outfile,"%s\n"," BCX_RetStr=BCX_TmpStr(LenSrc);");
fprintf(Outfile,"%s\n"," strcpy(BCX_RetStr,(char*)RemoveStr(RetVal,TokenChar));");
fprintf(Outfile,"%s\n"," if(RetVal)free(RetVal);");
fprintf(Outfile,"%s\n"," return BCX_RetStr;");
fprintf(Outfile,"%s\n","}\n\n");
}
if(Use_iReplace)
{
fprintf(Outfile,"%s\n","char *iReplace (char *src, char *pat, char *rep)");
fprintf(Outfile,"%s\n","{");
fprintf(Outfile,"%s\n"," size_t patsz, repsz, tmpsz, delta;");
fprintf(Outfile,"%s\n"," char *strtmp, *p, *q, *r;");
fprintf(Outfile,"%s\n"," if (!pat || !*pat)");
fprintf(Outfile,"%s\n"," {");
fprintf(Outfile,"%s\n"," strtmp = BCX_TmpStr(strlen(src));");
fprintf(Outfile,"%s\n"," if (!strtmp) return NULL;");
fprintf(Outfile,"%s\n"," return strcpy(strtmp, src);");
fprintf(Outfile,"%s\n"," }");
fprintf(Outfile,"%s\n"," repsz = strlen(rep);");
fprintf(Outfile,"%s\n"," patsz = strlen(pat);");
fprintf(Outfile,"%s\n"," for (tmpsz=0, p=src;(q=_stristr_(p,pat))!=0; p=q+patsz)");
fprintf(Outfile,"%s\n"," tmpsz += (size_t) (q - p) + repsz;");
fprintf(Outfile,"%s\n"," tmpsz += strlen(p);");
fprintf(Outfile,"%s\n"," strtmp = BCX_TmpStr(tmpsz);");
fprintf(Outfile,"%s\n"," if (!strtmp) return NULL;");
fprintf(Outfile,"%s\n"," for (r=strtmp,p=src;(q=_stristr_(p,pat))!=0;p=q+patsz)");
fprintf(Outfile,"%s\n"," {");
fprintf(Outfile,"%s\n"," delta = (size_t) (q-p);");
fprintf(Outfile,"%s\n"," memcpy(r,p,delta); r += delta;");
fprintf(Outfile,"%s\n"," strcpy(r,rep); r += repsz;");
fprintf(Outfile,"%s\n"," }");
fprintf(Outfile,"%s\n"," strcpy(r,p);");
fprintf(Outfile,"%s\n"," return strtmp;");
fprintf(Outfile,"%s\n","}\n\n");
}
if(Use_WideToAnsi)
{
fprintf(Outfile,"%s\n","char* WideToAnsi (wchar_t *WideStr, UINT CodePage,DWORD dwFlags)");
fprintf(Outfile,"%s\n","{");
fprintf(Outfile,"%s\n"," char *BCX_RetStr={0};");
fprintf(Outfile,"%s\n"," UINT uLen;");
fprintf(Outfile,"%s\n"," uLen=wcstombs(NULL, WideStr, 0); //WideCharToMultiByte(CodePage,dwFlags,WideStr,-1,0,0,0,0);");
fprintf(Outfile,"%s\n"," BCX_RetStr=(char*)BCX_TmpStr(uLen);");
fprintf(Outfile,"%s\n"," wcstombs(BCX_RetStr, WideStr, uLen); //WideCharToMultiByte(CodePage,dwFlags,WideStr,-1,BCX_RetStr,uLen,0,0);");
fprintf(Outfile,"%s\n"," return BCX_RetStr;");
fprintf(Outfile,"%s\n","}\n\n");
}
if(Use_SysStr)
{
fprintf(Outfile,"%s\n","BSTR SysStr (char * szIn, int widstr, int bfree)");
fprintf(Outfile,"%s\n","{");
fprintf(Outfile,"%s\n"," static BSTR bStr[32];");
fprintf(Outfile,"%s\n"," static int index;");
fprintf(Outfile,"%s\n"," if(bfree)");
fprintf(Outfile,"%s\n"," {");
fprintf(Outfile,"%s\n"," for(index=0; index<32; index+=1) ");
fprintf(Outfile,"%s\n"," SysFreeString(bStr[index]);");
fprintf(Outfile,"%s\n"," return 0;");
fprintf(Outfile,"%s\n"," }");
fprintf(Outfile,"%s\n"," index=(++index & 31);");
fprintf(Outfile,"%s\n"," SysFreeString(bStr[index]);");
fprintf(Outfile,"%s\n"," int length=strlen(szIn);");
fprintf(Outfile,"%s\n"," if(widstr)");
fprintf(Outfile,"%s\n"," {");
fprintf(Outfile,"%s\n"," bStr[index]=SysAllocStringLen(NULL, (2*length));");
fprintf(Outfile,"%s\n"," MultiByteToWideChar(CP_ACP,0,szIn,-1,bStr[index],(2*length+1));");
fprintf(Outfile,"%s\n"," }else{");
fprintf(Outfile,"%s\n"," bStr[index]=SysAllocStringByteLen(szIn, length);");
fprintf(Outfile,"%s\n"," }");
fprintf(Outfile,"%s\n"," return bStr[index];");
fprintf(Outfile,"%s\n","}\n\n");
}
if(Use_AnsiToWide)
{
fprintf(Outfile,"%s\n","wchar_t *AnsiToWide (char *AnsiStr, UINT CodePage,DWORD dwFlags)");
fprintf(Outfile,"%s\n","{");
fprintf(Outfile,"%s\n"," UINT uLen;");
fprintf(Outfile,"%s\n"," wchar_t *WideStr;");
fprintf(Outfile,"%s\n"," uLen=mbstowcs(NULL, AnsiStr, 0); //MultiByteToWideChar(CodePage,dwFlags,AnsiStr,-1,0,0);");
fprintf(Outfile,"%s\n"," if(uLen<=1) return (wchar_t*)BCX_TmpStr(2);");
fprintf(Outfile,"%s\n"," WideStr = (wchar_t*)BCX_TmpStr(2*uLen);");
fprintf(Outfile,"%s\n"," mbstowcs(WideStr, AnsiStr, uLen); //MultiByteToWideChar(CodePage,dwFlags,AnsiStr,uLen,WideStr,uLen);");
fprintf(Outfile,"%s\n"," return WideStr;");
fprintf(Outfile,"%s\n","}\n\n");
}
if(Use_FileLocked)
{
fprintf(Outfile,"%s\n","int FileLocked (char *Filename)");
fprintf(Outfile,"%s\n","{");
fprintf(Outfile,"%s%s%s\n"," FILE *FP=fopen(Filename,",enc("rb+"),");");
fprintf(Outfile,"%s\n"," if(FP==0) return 1;");
fprintf(Outfile,"%s\n"," fclose(FP);");
fprintf(Outfile,"%s\n"," return 0;");
fprintf(Outfile,"%s\n","}\n\n");
}
if(Use_ContainedIn)
{
fprintf(Outfile,"%s\n","int containedin(char * Token,char **Contain ,int c)");
fprintf(Outfile,"%s\n"," {");
fprintf(Outfile,"%s\n"," int i=0;");
fprintf(Outfile,"%s\n"," while(Contain[i][0])");
fprintf(Outfile,"%s\n"," {");
fprintf(Outfile,"%s\n"," if(0 == ((c == 0 || c == 2) ? strcmp(Contain[i],Token) : strcasecmp(Contain[i],Token)))");
fprintf(Outfile,"%s\n"," {");
fprintf(Outfile,"%s\n"," return ((c < 2) ? 0 : i);");
fprintf(Outfile,"%s\n"," }");
fprintf(Outfile,"%s\n"," i++;");
fprintf(Outfile,"%s\n"," }");
fprintf(Outfile,"%s\n"," return -1;");
fprintf(Outfile,"%s\n"," }\n\n");
}
if(Use_FindInType)
{
fprintf(Outfile,"%s\n","int FindInType(char *Token,char *StOffset,int StSize,int start,int finish,int c,int *idx)");
fprintf(Outfile,"%s\n"," {");
fprintf(Outfile,"%s\n"," int j;");
fprintf(Outfile,"%s\n"," char *Srch;");
fprintf(Outfile,"%s\n"," int (*cmp)(const char*,const char*);");
fprintf(Outfile,"%s\n"," cmp = ((c == 0 || c == 2) ? strcmp : strcasecmp);");
fprintf(Outfile,"%s\n"," for(j=start; j<=finish; j++)");
fprintf(Outfile,"%s\n"," {");
fprintf(Outfile,"%s\n"," Srch = StOffset + ((idx==0) ? j*StSize : idx[j]*StSize);");
fprintf(Outfile,"%s\n"," if(cmp(Srch,Token)==0)");
fprintf(Outfile,"%s\n"," {");
fprintf(Outfile,"%s\n"," return ((c < 2) ? 0 : j);");
fprintf(Outfile,"%s\n"," }");
fprintf(Outfile,"%s\n"," }");
fprintf(Outfile,"%s\n"," return -1;");
fprintf(Outfile,"%s\n"," }\n\n");
}
if(Use_StartupCode)
{
fprintf(Outfile,"%s\n","int BCX_StartupCode_(void)");
fprintf(Outfile,"%s\n","{");
{int i;
for(i=1; i<=StartNdx; i+=1)
{
fprintf(Outfile,"%s%s%s\n"," ",StartSub[i],"();");
}
}
fprintf(Outfile,"%s\n"," return 1;");
fprintf(Outfile,"%s\n","}\n\n");
}
if(Use_ExitCode)
{
fprintf(Outfile,"%s\n","int BCX_ExitCode_(void)");
fprintf(Outfile,"%s\n","{");
{int i;
for(i=1; i<=ExitNdx; i+=1)
{
fprintf(Outfile,"%s%s%s\n"," atexit(",ExitSub[i],");");
}
}
fprintf(Outfile,"%s\n"," return 1;");
fprintf(Outfile,"%s\n","}\n\n");
}
if(Use_Socket)
{
fprintf(Outfile,"%s\n","sockaddr_in sock_addr (char *ServerName,int port)");
fprintf(Outfile,"%s\n","{");
fprintf(Outfile,"%s\n"," in_addr iaHost;");
fprintf(Outfile,"%s\n"," hostent* lpHostEntry;");
fprintf(Outfile,"%s\n"," sockaddr_in saServer;");
fprintf(Outfile,"%s\n"," iaHost.s_addr=inet_addr(ServerName);");
fprintf(Outfile,"%s\n"," if(iaHost.s_addr==INADDR_NONE)");
fprintf(Outfile,"%s\n"," {");
fprintf(Outfile,"%s\n"," lpHostEntry=gethostbyname(ServerName);");
fprintf(Outfile,"%s\n"," }");
fprintf(Outfile,"%s\n"," else");
fprintf(Outfile,"%s\n"," {");
fprintf(Outfile,"%s\n"," lpHostEntry=gethostbyaddr((char*)&iaHost,sizeof(in_addr),AF_INET);");
fprintf(Outfile,"%s\n"," }");
fprintf(Outfile,"%s\n"," if(lpHostEntry==NULL)");
fprintf(Outfile,"%s\n"," {");
fprintf(Outfile,"%s%s%s\n"," printf(",enc("Error! HOST NOT FOUND: %s\\n"),", ServerName);");
fprintf(Outfile,"%s\n"," }");
fprintf(Outfile,"%s\n"," else");
fprintf(Outfile,"%s\n"," {");
fprintf(Outfile,"%s\n"," saServer.sin_port=htons(port);");
fprintf(Outfile,"%s\n"," saServer.sin_family=AF_INET;");
fprintf(Outfile,"%s\n"," saServer.sin_addr=*(in_addr*)lpHostEntry->h_addr;");
fprintf(Outfile,"%s\n"," }");
fprintf(Outfile,"%s\n"," return saServer;");
fprintf(Outfile,"%s\n","}\n\n");
fprintf(Outfile,"%s\n","int connect_socket (sockaddr_in saServer)");
fprintf(Outfile,"%s\n","{");
fprintf(Outfile,"%s\n"," int Socket, nRet;");
fprintf(Outfile,"%s\n"," Socket=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);");
fprintf(Outfile,"%s\n"," if(Socket==-1)");
fprintf(Outfile,"%s\n"," {");
fprintf(Outfile,"%s\n"," return Socket;");
fprintf(Outfile,"%s\n"," }");
fprintf(Outfile,"%s\n"," nRet=connect(Socket,(sockaddr*)&saServer,sizeof(sockaddr_in));");
fprintf(Outfile,"%s\n"," if(nRet==-1)");
fprintf(Outfile,"%s\n"," {");
fprintf(Outfile,"%s\n"," close(Socket);");
fprintf(Outfile,"%s\n"," return nRet;");
fprintf(Outfile,"%s\n"," }");
fprintf(Outfile,"%s\n"," return Socket;");
fprintf(Outfile,"%s\n","}\n\n");
fprintf(Outfile,"%s\n","int BcxSocket (char *ServerName,int port)");
fprintf(Outfile,"%s\n","{");
fprintf(Outfile,"%s\n"," sockaddr_in saServer;");
fprintf(Outfile,"%s\n"," saServer=sock_addr(ServerName,port);");
fprintf(Outfile,"%s\n"," return connect_socket(saServer);");
fprintf(Outfile,"%s\n","}\n\n");
fprintf(Outfile,"%s\n","int BcxSocketSend (int Socket, char *szBuffer)");
fprintf(Outfile,"%s\n","{");
fprintf(Outfile,"%s\n"," static int nRet;");
fprintf(Outfile,"%s\n"," nRet=send(Socket,szBuffer,strlen(szBuffer),0);");
fprintf(Outfile,"%s\n"," if(nRet==-1)");
fprintf(Outfile,"%s\n"," {");
fprintf(Outfile,"%s\n"," close(Socket);");
fprintf(Outfile,"%s\n"," }");
fprintf(Outfile,"%s\n"," return nRet;");
fprintf(Outfile,"%s\n","}\n\n");
fprintf(Outfile,"%s\n","int BcxSocketRead (int Socket, char *szBuffer)");
fprintf(Outfile,"%s\n","{");
fprintf(Outfile,"%s\n"," return read(Socket,szBuffer,strlen(szBuffer));");
fprintf(Outfile,"%s\n","}\n\n");
fprintf(Outfile,"%s\n","void BcxSocketClose(int Socket) {");
fprintf(Outfile,"%s\n"," close(Socket);");
fprintf(Outfile,"%s\n","}\n\n");
}
if(Use_RegEx)
{
fprintf(Outfile,"%s\n","bool regmatch (char *buffer, char *pattern, REGEX* retval)");
fprintf(Outfile,"%s\n","{");
fprintf(Outfile,"%s\n"," static int t;");
fprintf(Outfile,"%s\n"," static int i;");
fprintf(Outfile,"%s\n"," static regex_t re;");
fprintf(Outfile,"%s\n"," t=regcomp( &re,pattern,REG_ICASE|REG_EXTENDED);");
fprintf(Outfile,"%s\n"," if(t)");
fprintf(Outfile,"%s\n"," {");
fprintf(Outfile,"%s\n"," regerror(t, &re,buffer,sizeof(buffer));");
fprintf(Outfile,"%s%s%s\n"," printf(",enc("regex error: %s %s"),",buffer,pattern);");
fprintf(Outfile,"%s\n"," return 0;");
fprintf(Outfile,"%s\n"," }");
fprintf(Outfile,"%s\n"," t=regexec( &re,buffer,1023,(*retval).matches,0);");
fprintf(Outfile,"%s\n"," (*retval).count=re.re_nsub;");
fprintf(Outfile,"%s\n"," if(!t)");
fprintf(Outfile,"%s\n"," {");
fprintf(Outfile,"%s\n"," for(i=1; i<=(*retval).count; i+=1)");
fprintf(Outfile,"%s\n"," {");
fprintf(Outfile,"%s\n"," if((*retval).matches[i].rm_so>=0)");
fprintf(Outfile,"%s\n"," {");
fprintf(Outfile,"%s\n"," (*retval).results[i]=peekstr( &buffer[(*retval).matches[i].rm_so],((*retval).matches[i].rm_eo-(*retval).matches[i].rm_so));");
fprintf(Outfile,"%s\n"," }");
fprintf(Outfile,"%s\n"," }");
fprintf(Outfile,"%s\n"," }");
fprintf(Outfile,"%s\n"," regfree( &re);");
fprintf(Outfile,"%s\n"," if(!t)");
fprintf(Outfile,"%s\n"," {");
fprintf(Outfile,"%s\n"," return TRUE;");
fprintf(Outfile,"%s\n"," }");
fprintf(Outfile,"%s\n"," else");
fprintf(Outfile,"%s\n"," {");
fprintf(Outfile,"%s\n"," return FALSE;");
fprintf(Outfile,"%s\n"," }");
fprintf(Outfile,"%s\n","}\n\n");
}
}
int JoinLines (char *Arg)
{
if(iMatchRgt(Arg," _"))
{
Arg[strlen(Arg)-1]=0;
strcat(CurLine,Arg);
return 1;
}
if(*CurLine!=0)
{
strcpy(Arg, join(2,CurLine,Arg));
*CurLine=0;
}
UmQt=FALSE;
return 0;
}
void StripCode (char *Arg)
{
PCHAR p;
PCHAR p2=Arg;
int asmFlag=0;
int eStr=0;
char sub_[2048];
while((*p2>8&&*p2<14)||*p2==32)
{
p2++;
}
if(*p2==33)
{
asmFlag=!UmQt;
}
p=p2;
while(*p)
{
if(*p==9)
{
*p=32;
}
if(*p==34)
{
if(*(p-1)==69)
{
*(p-1)=1;
eStr=TRUE;
}
while(*(++p)!=34)
{
if(*p==92&&eStr)
{
*p=2;
for(;;)
{
if(*(p+1)==48)
{
*(p+1)=3;
break;
}
if(*(p+1)==116)
{
*(p+1)=4;
break;
}
if(*(p+1)==110)
{
*(p+1)=5;
break;
}
if(*(p+1)==114)
{
*(p+1)=6;
break;
}
if(*(p+1)==113)
{
*(p+1)=7;
break;
}
if(*(p+1)==92)
{
*(p+1)=8;
}
break;
}
p++;
}
if(*p==0)
{
UmQt=!UmQt;
break;
}
}
}
if(!UmQt&&!asmFlag)
{
if((*p BOR 32)==114)
{
if((*(p+1) BOR 32)==101&&(*(p+2) BOR 32)==109&&(*(p+3)==32||*(p+3)==0))
{
if(p==p2||*(p-1)==58||*(p-1)==32)
{
*p=0;
break;
}
}
}
if(*p==39||(*p==47&&*(p+1)==47))
{
*p=0;
break;
}
}
p++;
}
while(p2<p)
{
while((*(p-1)>8&&*(p-1)<14)||*(p-1)==32)
{
*(--p)=0;
}
if(UmQt||asmFlag)
{
break;
}
if(*(p-1)==58&&*(p-2)==32)
{
p--;
}
else
{
break;
}
}
if(eStr)
{
strcpy(p2,replace(p2,chr(1),""));
strcpy(p2,replace(p2,chr(2),""));
strcpy(sub_, join(3,DQ,"+CHR$(0)+",DQ));
strcpy(p2,replace(p2,chr(3),sub_));
strcpy(sub_, join(3,DQ,"+CHR$(9)+",DQ));
strcpy(p2,replace(p2,chr(4),sub_));
strcpy(sub_, join(3,DQ,"+CHR$(10)+",DQ));
strcpy(p2,replace(p2,chr(5),sub_));
strcpy(sub_, join(3,DQ,"+CHR$(13)+",DQ));
strcpy(p2,replace(p2,chr(6),sub_));
strcpy(sub_, join(3,DQ,"+CHR$(34)+",DQ));
strcpy(p2,replace(p2,chr(7),sub_));
strcpy(sub_, join(3,DQ,"+CHR$(92)+",DQ));
strcpy(p2,replace(p2,chr(8),sub_));
strcpy(p2,replace(p2,(join(3,chr(34),chr(34),chr(43))),""));
strcpy(p2,replace(p2,(join(3,chr(43),chr(34),chr(34))),""));
}
memcpy(Arg,p2,strlen(p2)+1);
}
void ProcSingleLineIf (int* ifFlag)
{
char Tmp[2048];
int ifp;
int NdIfs;
static int EFlag;
if((*ifFlag)==0)
{
EFlag=0;
}
REDO:;
if(SplitCnt>120)
{
Abort("Stack Overflow - Too many statements on one line");
}
strcpy(Tmp, join(2,SplitStk[SplitCnt],SPC));
if(iMatchLft(Tmp,"if "))
{
ifp=iMatchNQ(Tmp," then ");
if(ifp)
{
strcpy(SplitStk[SplitCnt++],left(Tmp,ifp+4));
strcpy(SplitStk[SplitCnt],ltrim(Tmp+ifp+4));
EFlag=_MAX_(0,EFlag-1);
(*ifFlag)++;
goto REDO;
}
}
else if((*ifFlag))
{
if(iMatchLft(Tmp,"else "))
{
LFTLSE:;
if(++EFlag>1)
{
NdIfs=_MAX_(1,(*ifFlag)-1);
(*ifFlag)=1;
EFlag=0;
if(iMatchWrd(SplitStk[SplitCnt-1],"else"))
{
SplitCnt--;
}
{int BCX_REPEAT;
for(BCX_REPEAT=1;BCX_REPEAT<=NdIfs;BCX_REPEAT++)
{
strcpy(SplitStk[SplitCnt++],"END IF");
}
}
}
strcpy(SplitStk[SplitCnt++],"ELSE");
strcpy(SplitStk[SplitCnt],trim(Tmp+4));
goto REDO;
}
else
{
ifp=iMatchNQ(Tmp," else ");
if(ifp)
{
strcpy(SplitStk[SplitCnt++],rtrim(left(Tmp,ifp-1)));
strcpy(Tmp,mid(Tmp,ifp+1));
goto LFTLSE;
}
}
}
}
int SplitLines (char *Arg)
{
PCHAR p=Arg;
PCHAR st=Arg;
int i=0;
int IfFlag=0;
int SpcolonFlag=0;
int ParaCnt=0;
if(*p==33||*p==36)
{
return 0;
}
while(*p)
{
if(*p==32)
{
SpcolonFlag=1;
}
if(*p==34)
{
while(*(++p)!=34)
{
if(*p==0)
{
return SplitCnt;
}
}
}
if(*p==40)
{
ParaCnt++;
}
if(*p==41)
{
ParaCnt--;
}
if(*p==58&&*(p+1)!=61)
{
if(*(p+1)==58)
{
*p=-15;
*(p+1)=-15;
}
else
{
if(*(p+1)!=0||SpcolonFlag)
{
while(*st==32)
{
st++;
}
SplitCnt++;
while(st<p)
{
SplitStk[SplitCnt][i++]=*(st++);
}
while(SplitStk[SplitCnt][i-1]==32)
{
i--;
}
SplitStk[SplitCnt][i]=0;
if(ParaCnt==0)
{
i=0;
st++;
ProcSingleLineIf( &IfFlag);
}
else
{
SplitCnt--;
}
}
}
}
p++;
}
if(SplitCnt>0)
{
while(*st==32)
{
st++;
}
SplitCnt++;
while(*st)
{
SplitStk[SplitCnt][i++]=*(st++);
}
SplitStk[SplitCnt][i]=0;
ProcSingleLineIf( &IfFlag);
}
else if(iMatchLft(Arg,"if ")&&!iMatchRgt(Arg," then"))
{
strcpy(SplitStk[++SplitCnt],Arg);
ProcSingleLineIf( &IfFlag);
}
if(IfFlag)
{
while(IfFlag)
{
strcpy(SplitStk[++SplitCnt],"END IF");
IfFlag--;
}
}
return SplitCnt;
}
int iMatch (char *Arg, char *MatchStr, int mt)
{
if(mt==2)
{
int L1;
int L2;
L1=strlen(Arg);
L2=strlen(MatchStr);
if(L1<L2)
{
return 0;
}
Arg=(Arg+L1)-L2;
}
while(*MatchStr)
{
if(*Arg==0)
{
return 0;
}
if((*Arg BOR 32)!=(*MatchStr BOR 32))
{
return 0;
}
Arg++;
MatchStr++;
}
if(mt&&*Arg!=0)
{
return 0;
}
return 1;
}
int iMatchNQ (char *Arg, char *MatchStr)
{
int mi=0;
PCHAR a=Arg;
while(MatchStr[mi])
{
if(*a==34)
{
mi=0;
while(*(++a)!=34)
{
if(*a==0)
{
return 0;
}
}
}
if(a[mi]==0)
{
return 0;
}
if((a[mi] BOR 32)!=(MatchStr[mi] BOR 32))
{
a++;
mi=-1;
}
mi++;
}
return (a-Arg)+1;
}
int SpecialCaseHandler (char *Arg)
{
int i;
int j;
char lsz[2048];
if(iMatchNQ(Arg," sub ")||iMatchNQ(Arg," function "))
{
return 0;
}
if(iMatchNQ(Arg,"function main("))
{
strcpy(SrcStk[++SrcCnt],Arg);
strcpy(SrcStk[++SrcCnt],"G_argc = argc");
strcpy(SrcStk[++SrcCnt],"G_argv = argv");
goto PROCESSNEW;
}
strcpy(lsz, join(3,SPC,extract(Arg," "),SPC));
if(iMatchNQ(" dim , local , global , raw , static , shared , dynamic , auto , register , extern ",lsz))
{
FastLexer(Arg," ",",(){}");
for(i=1; i<=Ndx; i+=1)
{
if(iMatchWrd(Stk[i],"as"))
{
strcpy(Stk[i-1],Clean(Stk[i-1]));
}
}
strcpy(Stk[2], join(3,SPC,Stk[2],SPC));
if(iMatchNQ(" raw local dynamic register static shared auto ",Stk[2]))
{
strcpy(Stk[1], join(2,Stk[1],Stk[2]));
*Stk[2]=0;
}
SrcCnt++;
j=0;
for(i=1; i<=Ndx; i+=1)
{
if(Stk[i][0]==40)
{
j++;
}
if(Stk[i][0]==123)
{
j++;
}
if(Stk[i][0]==41)
{
j--;
}
if(Stk[i][0]==125)
{
j--;
}
if(Stk[i][0]==44&&!j)
{
strcpy(Stk[i],Stk[1]);
SrcCnt++;
}
strcpy(SrcStk[SrcCnt], join(3,SrcStk[SrcCnt],Stk[i]," "));
}
goto PROCESSNEW;
}
for(;;)
{
if(TRUE==iMatchLft(Arg,"on "))
{
int Target;
j=0;
FastLexer(Arg," ",",");
for(i=1; i<=Ndx; i+=1)
{
if(iMatchLft(Stk[i],"gosub")||iMatchLft(Stk[i],"goto")||iMatchLft(Stk[i],"call"))
{
Target=i+1;
break;
}
}
strcpy(SrcStk[++SrcCnt],"select case ");
for(i=2; i<=Target-2; i+=1)
{
strcpy(SrcStk[SrcCnt], join(3,SrcStk[SrcCnt]," ",Stk[i]));
}
for(i=Target; i<=Ndx; i+=1)
{
if(str_cmp(Stk[i],",")==0)
{
continue;
}
j++;
strcpy(SrcStk[++SrcCnt], join(2,"case",str(j)));
strcpy(SrcStk[++SrcCnt], join(3,Stk[Target-1]," ",Stk[i]));
}
strcpy(SrcStk[++SrcCnt],"end select");
goto PROCESSNEW;
}
if(TRUE==iMatchLft(Arg,"loop "))
{
FastLexer(Arg," ",",()");
if(iMatchLft(Stk[2],"until"))
{
strcpy(SrcStk[++SrcCnt],"if ");
for(i=3; i<=Ndx; i+=1)
{
strcpy(SrcStk[SrcCnt], join(3,SrcStk[SrcCnt],Stk[i]," "));
}
strcpy(SrcStk[SrcCnt], join(2,SrcStk[SrcCnt]," then"));
strcpy(SrcStk[++SrcCnt],"exit loop");
strcpy(SrcStk[++SrcCnt],"end if");
strcpy(SrcStk[++SrcCnt],"loop");
goto PROCESSNEW;
}
else if(iMatchLft(Stk[2],"while"))
{
strcpy(SrcStk[++SrcCnt],"if NOT (");
for(i=3; i<=Ndx; i+=1)
{
strcpy(SrcStk[SrcCnt], join(3,SrcStk[SrcCnt],Stk[i]," "));
}
strcpy(SrcStk[SrcCnt], join(2,SrcStk[SrcCnt],") then"));
strcpy(SrcStk[++SrcCnt],"exit loop");
strcpy(SrcStk[++SrcCnt],"end if");
strcpy(SrcStk[++SrcCnt],"loop");
goto PROCESSNEW;
}
else
{
if(Ndx>1)
{
Abort(join(3,"UNKNOWN Word ",Stk[2]," After LOOP"));
}
}
break;
}
if(TRUE==iMatchLft(Arg,"do "))
{
FastLexer(Arg," ",",()");
if(iMatchLft(Stk[2],"until"))
{
strcpy(SrcStk[++SrcCnt],"do");
strcpy(SrcStk[++SrcCnt],"if ");
for(i=3; i<=Ndx; i+=1)
{
strcpy(SrcStk[SrcCnt], join(3,SrcStk[SrcCnt],Stk[i]," "));
}
strcpy(SrcStk[SrcCnt], join(2,SrcStk[SrcCnt],"then"));
strcpy(SrcStk[++SrcCnt],"exit loop");
strcpy(SrcStk[++SrcCnt],"end if");
goto PROCESSNEW;
}
else if(iMatchLft(Stk[2],"while"))
{
strcpy(SrcStk[++SrcCnt],"while ");
for(i=3; i<=Ndx; i+=1)
{
strcpy(SrcStk[SrcCnt], join(3,SrcStk[SrcCnt],Stk[i]," "));
}
goto PROCESSNEW;
}
else
{
if(Ndx>1)
{
Abort(join(3,"UNKNOWN Word ",Stk[2]," After DO"));
}
}
}
break;
}
return 0;
PROCESSNEW:;
Ndx=i=0;
while(SrcCnt)
{
strcpy(Arg,SrcStk[++i]);
*SrcStk[i]=0;
SrcCnt--;
Parse(Arg);
if(Ndx)
{
Emit();
}
}
return TRUE;
}
void FastLexer (char * Arg,char * delim1,char * delim2,int TokQuote)
{
int cnt1=0;
int cnt2=0;
PCHAR pd1;
PCHAR pd2;
Ndx=1;
while(Arg[cnt1])
{
if(Arg[cnt1]==34)
{
if(cnt2&&TokQuote)
{
Stk[Ndx++][cnt2]=0;
cnt2=0;
}
Stk[Ndx][cnt2]=34;
while(Arg[++cnt1]!=34)
{
Stk[Ndx][++cnt2]=Arg[cnt1];
if(Arg[cnt1]==0)
{
return;
}
}
Stk[Ndx][++cnt2]=Arg[cnt1];
if(TokQuote)
{
Stk[Ndx++][++cnt2]=0;
cnt2=0;
goto AGAIN;
}
}
pd1=delim1;
while(*pd1)
{
if(*(pd1++)==Arg[cnt1])
{
if(cnt2)
{
Stk[Ndx++][cnt2]=0;
cnt2=0;
}
goto AGAIN;
}
}
pd2=delim2;
while(*pd2)
{
if(*(pd2++)==Arg[cnt1])
{
if(cnt2)
{
Stk[Ndx++][cnt2]=0;
}
Stk[Ndx][0]=Arg[cnt1];
Stk[Ndx++][1]=0;
cnt2=0;
goto AGAIN;
}
}
Stk[Ndx][cnt2++]=Arg[cnt1];
AGAIN:;
cnt1++;
}
Stk[Ndx][cnt2]=0;
if(cnt2==0)
{
Ndx--;
}
}
void InsertTokens (int PosAfter, int NumTokens, ...)
{
va_list ap;
int i;
for(i=Ndx; i>=PosAfter+1; i+=-1)
{
strcpy(Stk[i+NumTokens],Stk[i]);
}
va_start(ap,NumTokens);
for(i=PosAfter+1; i<=PosAfter+NumTokens; i+=1)
{
strcpy(Stk[i],va_arg(ap,char*));
}
va_end(ap);
Ndx+=(NumTokens);
}
void EmitExportDef (char *fs)
{
static int beenhere;
char fname[2048];
char funcname[2048];
int i;
int st=1;
int sz=0;
strcpy(fname, join(2,extract(FileIn,"."),".def"));
if(!beenhere)
{
if((fpdef=fopen(fname,"w"))==0)
{
fprintf(stderr,"Can't open file %s\n",fname);
exit(1);
}
_splitpath_(FileIn,NULL,NULL,fname,NULL);
fprintf(fpdef,"%s%s\n","LIBRARY ",enc(fname));
fprintf(fpdef,"%s\n","EXPORTS");
beenhere=TRUE;
}
FastLexer(fs,"","(,)");
while(*Stk[st]!=40)
{
st++;
}
for(i=st+1; i<=Ndx; i+=1)
{
if(*Stk[i]==41)
{
break;
}
if(*Stk[i]!=44)
{
if(inchr(Stk[i],"*"))
{
sz+=(4);
continue;
}
if(instr_b(Stk[i],"longlong",1,1)||instr_b(Stk[i],"double",1,1)||instr_b(Stk[i],"long long"))
{
sz+=(8);
continue;
}
if(!inchr(Stk[i],"void"))
{
sz+=(4);
}
}
}
strcpy(Stk[1],trim(Stk[1]));
strcpy(funcname,mid(Stk[1],InstrRev(Stk[1]," ")+1));
fprintf(fpdef,"%s%s%s%s%s\n",funcname," = _",funcname,"@",ltrim(str(sz)));
}
char * GetArg (int ArgNum, functionParse* fp)
{
char *BCX_RetStr={0};
char RetArg[2048];
int ArgEnd=fp->CommaPos[ArgNum]-1;
int ArgStart=fp->CommaPos[ArgNum-1]+1;
*RetArg=0;
if(ArgNum>=fp->NumArgs)
{
ArgEnd=Ndx;
}
for(ArgStart=ArgStart; ArgStart<=ArgEnd; ArgStart+=1)
{
strcat(RetArg,Stk[ArgStart]);
}
BCX_RetStr=BCX_TmpStr(strlen(RetArg));
strcpy(BCX_RetStr,RetArg);
return BCX_RetStr;
}
int SepFuncArgs (int Strt, functionParse* fp, int functionflag)
{
int CountR=0;
int i=Strt;
if(functionflag)
{
while(i<=Ndx)
{
if(Stk[i][0]==40)
{
break;
}
i++;
}
Strt=i+1;
fp->NumArgs=0;
fp->CommaPos[0]=i;
if(Strt>Ndx)
{
return 0;
}
}
else
{
Strt=2;
fp->CommaPos[0]=1;
}
if(*Stk[Strt]==41)
{
fp->CommaPos[1]=Strt;
return 0;
}
fp->NumArgs=1;
for(i=Strt; i<=Ndx; i+=1)
{
if(*Stk[i]==40||*Stk[i]==91)
{
CountR++;
}
else if(*Stk[i]==41||*Stk[i]==93)
{
if(CountR==0)
{
fp->CommaPos[fp->NumArgs]=i;
break;
}
CountR--;
}
else if(*Stk[i]==44&&CountR==0)
{
fp->CommaPos[fp->NumArgs]=i;
fp->NumArgs++;
}
}
if(functionflag==0)
{
fp->CommaPos[fp->NumArgs]=Ndx;
}
return fp->NumArgs;
}
PCHAR MakeDecProto (functionParse* fp)
{
functionParse fpp;
char FunType[2048];
char AsType[2048];
char AsArrys[2048];
int FoundAs;
int pointer=0;
int i;
int ii;
char OptValue[2048];
int OptFlag=0;
static char Proto[2048];
static int SubFunPtr;
if(SubFunPtr)
{
goto ARGPARSE;
}
*Proto=0;
*FunType=0;
if(iMatchWrd(Stk[2],"sub")||iMatchWrd(Stk[2],"constructor")||iMatchWrd(Stk[2],"destructor"))
{
strcpy(FunType,"void");
}
else if(*Stk[Ndx]==41)
{
strcpy(FunType,VarTypeLookup[inchr(VarTypes,right(Stk[3],1))]);
}
else
{
for(i=Ndx; i>=fp->CommaPos[fp->NumArgs]+1; i+=-1)
{
if(iMatchWrd(Stk[i],"ptr"))
{
pointer++;
}
else if(iMatchWrd(Stk[i],"as"))
{
break;
}
else
{
strcpy(FunType, join(3,Stk[i],SPC,FunType));
}
}
}
if(InTypeDef)
{
if(iMatchWrd(Stk[2],"constructor"))
{
strcpy(Proto, join(2,Clean(Stk[3]),"("));
}
else if(iMatchWrd(Stk[2],"destructor"))
{
strcpy(Proto, join(3,"~",Clean(Stk[3]),"("));
}
else
{
strcpy(Proto, join(4,FunType," ",Clean(Stk[3]),"("));
}
char Var[2048];
int w;
int id;
int vt;
strcpy(Var, join(2,FunType,stringx(pointer,42)));
GetTypeInfo(Var, &w, &id, &vt);
AddTypedefElement(BaseTypeDefsCnt[InTypeDef],vt,Clean(Stk[3]),FunType,0);
}
else if(SFPOINTER)
{
strcpy(Proto, join(7,"typedef ",FunType," (",CallType,"*",Clean(Stk[3]),"_TYPE)("));
}
else if(!NoTypeDeclare)
{
strcpy(Proto, join(7,"typedef ",FunType," (",CallType,"*BCXFPROT",ltrim(str(DllCnt)),")("));
}
else
{
if(UseCProto)
{
UseCProto=FALSE;
strcpy(Proto, join(7,FunType," ",stringx(pointer,42),SPC,CallType,Clean(Stk[3]),"("));
}
else
{
strcpy(Proto, join(8,"C_IMPORT ",FunType," ",stringx(pointer,42),SPC,CallType,Clean(Stk[3]),"("));
}
}
ARGPARSE:;
if(fp->NumArgs==0)
{
if(iMatchWrd(Stk[2],"destructor")||iMatchWrd(Stk[2],"constructor")||Use_Virtual)
{
strcat(Proto,")");
}
else
{
strcat(Proto,"void)");
}
}
else
{
for(ii=0; ii<=fp->NumArgs-1; ii+=1)
{
*OptValue=0;
*AsType=0;
*AsArrys=0;
pointer=0;
FoundAs=0;
int FirstToken=fp->CommaPos[ii]+1;
int LastToken=fp->CommaPos[ii+1]-1;
int NumOfTokens=(LastToken-FirstToken)+1;
i=inchr(Stk[FirstToken],"[");
if(i)
{
strcpy(AsArrys,mid(Stk[FirstToken],i));
Stk[FirstToken][i-1]=0;
}
if(NumOfTokens==1)
{
strcpy(AsType,VarTypeLookup[inchr(VarTypes,right(Stk[FirstToken],1))]);
if(*AsArrys)
{
strcpy(AsType,RemoveStr(AsType,"*"));
}
else
{
pointer=tally(Stk[FirstToken],"*");
}
FoundAs=TRUE;
}
else
{
for(i=LastToken; i>=FirstToken; i+=-1)
{
if(iMatchWrd(Stk[i],"ptr")||*Stk[i]==42)
{
pointer++;
}
else if(iMatchWrd(Stk[i],"sub"))
{
SepFuncArgs(fp->CommaPos[ii]+2, &fpp,TRUE);
strcat(Proto,"void (*)(");
SubFunPtr=FoundAs=TRUE;
MakeDecProto( &fpp);
SubFunPtr=FALSE;
break;
}
else if(iMatchWrd(Stk[i],"function"))
{
SepFuncArgs(fp->CommaPos[ii]+2, &fpp,TRUE);
if(AsType[0]==0)
{
strcpy(AsType,VarTypeLookup[inchr(VarTypes,right(Stk[FirstToken],1))]);
}
strcpy(Proto, join(4,Proto,rtrim(AsType),stringx(pointer,42)," (*)("));
pointer=0;
*AsType=0;
SubFunPtr=FoundAs=TRUE;
MakeDecProto( &fpp);
SubFunPtr=FALSE;
break;
}
else if(iMatchWrd(Stk[i],"as"))
{
if(AsType[0]==0)
{
Abort(join(2,"No type specified for argument",str(ii+1)));
}
FoundAs=TRUE;
break;
}
else if(*Stk[i]==61)
{
OptFlag=FoundAs=TRUE;
strcpy(OptValue, join(2," =",AsType));
*AsType=0;
if(i==FirstToken+1)
{
strcpy(AsType,VarTypeLookup[inchr(VarTypes,right(Stk[FirstToken],1))]);
if(*AsArrys)
{
strcpy(AsType,RemoveStr(AsType,"*"));
}
else
{
pointer=tally(Stk[FirstToken],"*");
}
break;
}
}
else
{
if(*Stk[i]!=46)
{
strcpy(AsType, join(3,Stk[i],SPC,AsType));
}
else
{
if(*Stk[i-1]==46)
{
if(OptFlag)
{
Abort("Default value not allowed when using variable arguments");
}
if(ii!=(fp->NumArgs-1))
{
Abort("Variable argument must be the last parameter");
}
if(fp->NumArgs==1)
{
Abort("Variable argument must be preceded by at least one other parameter");
}
FoundAs=TRUE;
}
strcpy(AsType, join(2,Stk[i],AsType));
}
}
}
}
if(!FoundAs)
{
Abort(join(2,"Malformed argument type in parameter",str(ii+1)));
}
if(ii!=fp->NumArgs&&OptFlag&&str_cmp(OptValue,"")==0)
{
Warning(join(2,"No default value specified for parameter",str(ii+1)),1);
}
strcpy(Proto, join(6,Proto,rtrim(AsType),AsArrys,stringx(pointer,42),OptValue,Stk[fp->CommaPos[ii+1]]));
}
}
return Proto;
}
void AsmUnknownStructs (int CompArrays)
{
int InBrace=0;
int InStruct=0;
int i;
char sztemp[2048];
for(i=2; i<=Ndx; i+=1)
{
if(CompArrays)
{
if(str_cmp(Stk[i],"[")==0)
{
strcpy(sztemp,Stk[i-1]);
*Stk[i-1]=0;
for(;;)
{
strcat(sztemp,Stk[i]);
if(str_cmp(Stk[i],"]")==0)
{
InBrace--;
}
if(str_cmp(Stk[i],"[")==0)
{
InBrace++;
}
*Stk[i]=0;
i++;
if(!(InBrace&&i<=Ndx))
{
break;
}
}
strcpy(Stk[--i],sztemp);
}
}
if(strlen(Stk[i])>1&&!IsNumber(Stk[i]+1))
{
if(*Stk[i]==46||iMatchLft(Stk[i],"->"))
{
if(InStruct==0)
{
strcpy(Stk[i], join(2,Stk[i-1],Stk[i]));
*Stk[i-1]=0;
InStruct=i;
}
else
{
strcat(Stk[InStruct],Stk[i]);
*Stk[i]=0;
}
continue;
}
}
if(*Stk[i]&&InStruct>0)
{
InStruct=0;
}
}
RemEmptyTokens();
}
void EmitIfCond (char *CondType)
{
int TestString;
int A;
int B;
int ParCnt;
int Tmp;
int IsWhile=FALSE;
char szTest[2048];
TestString=DataType(Stk[2]);
if(TestString==vt_STRVAR)
{
if(str_cmp(Stk[4],DDQ)==0)
{
strcpy(Stk[2], join(2,Clean(Stk[2]),"[0]"));
strcpy(Stk[4],"0");
}
else if(str_cmp(Stk[3],"[")==0 && str_cmp(Stk[7],DDQ)==0)
{
strcpy(Stk[2],Clean(Stk[2]));
strcat(Stk[5],"[0]");
strcpy(Stk[7],"0");
}
}
if(str_cmp(CondType,"while")==0)
{
IsWhile=TRUE;
}
fprintf(Outfile,"%s%s%s",Scoot,CondType,"(");
Tmp=2;
while(str_cmp(Stk[Tmp],"(")==0 || str_cmp(Stk[Tmp],"!")==0)
{
fprintf(Outfile,"%s",Stk[Tmp]);
Tmp++;
}
TestString=FALSE;
A=DataType(Stk[Tmp]);
if(A==vt_STRLIT||A==vt_STRVAR)
{
if(str_cmp(Stk[Tmp+1],")")!=0 && !iMatchWrd(Stk[Tmp+1],"then"))
{
TestString=TRUE;
Use_Str_Cmp=TRUE;
fprintf(Outfile,"%s","str_cmp(");
}
}
*szTest=0;
ParCnt=0;
for(;;)
{
if(TestString)
{
if(str_cmp(Stk[Tmp],"=")==0)
{
strcpy(Stk[Tmp],",");
strcpy(szTest,")==0");
ParCnt=0;
}
else if(str_cmp(Stk[Tmp],"!=")==0)
{
strcpy(Stk[Tmp],",");
strcpy(szTest,")!=0");
ParCnt=0;
}
else if(str_cmp(Stk[Tmp],">")==0)
{
if(str_cmp(Stk[Tmp+1],"=")==0)
{
strcpy(Stk[Tmp],",");
strcpy(szTest,")>=0");
*Stk[Tmp+1]=0;
}
else
{
strcpy(Stk[Tmp],",");
strcpy(szTest,")==1");
}
ParCnt=0;
}
else if(str_cmp(Stk[Tmp],"<")==0)
{
if(str_cmp(Stk[Tmp+1],"=")==0)
{
strcpy(Stk[Tmp],",");
strcpy(szTest,")<=0");
*Stk[Tmp+1]=0;
}
else
{
strcpy(Stk[Tmp],",");
strcpy(szTest,")==-1");
}
ParCnt=0;
}
else if(str_cmp(Stk[Tmp],"(")==0)
{
ParCnt++;
}
else if(str_cmp(Stk[Tmp],")")==0)
{
ParCnt--;
}
if(str_cmp(Stk[Tmp],")")==0 && str_cmp(szTest,"")!=0 && ParCnt<0)
{
fprintf(Outfile,"%s%s",szTest,Stk[Tmp]);
*szTest=0;
}
else
{
if(str_cmp(Stk[Tmp],"||")==0 || str_cmp(Stk[Tmp],"&&")==0)
{
strcpy(Stk[Tmp], join(4,szTest," ",Stk[Tmp]," "));
*szTest=0;
B=1;
while(str_cmp(Stk[Tmp+B],"(")==0)
{
strcat(Stk[Tmp],"(");
*Stk[Tmp+B]=0;
B++;
}
A=DataType(Stk[Tmp+B]);
if((A==vt_STRLIT||A==vt_STRVAR)&&str_cmp(Stk[Tmp+B+1],")")!=0)
{
strcat(Stk[Tmp]," str_cmp(");
Use_Str_Cmp=TRUE;
}
else
{
fprintf(Outfile,"%s",Clean(Stk[Tmp]));
TestString=FALSE;
goto NXTTOKEN;
}
}
fprintf(Outfile,"%s",Clean(Stk[Tmp]));
}
}
else
{
if(str_cmp(Stk[Tmp],"||")==0 || str_cmp(Stk[Tmp],"&&")==0)
{
B=1;
while(str_cmp(Stk[Tmp+B],"(")==0)
{
strcat(Stk[Tmp],"(");
*Stk[Tmp+B]=0;
B++;
}
A=DataType(Stk[Tmp+B]);
if((A==vt_STRLIT||A==vt_STRVAR)&&str_cmp(Stk[Tmp+B+1],")")!=0)
{
strcat(Stk[Tmp],"str_cmp(");
TestString=TRUE;
Use_Str_Cmp=TRUE;
*szTest=0;
ParCnt=0;
fprintf(Outfile,"%s",Clean(Stk[Tmp]));
goto NXTTOKEN;
}
}
if(str_cmp(Stk[Tmp],"!")==0)
{
fprintf(Outfile,"%s",Stk[Tmp]);
}
else
{
fprintf(Outfile,"%s",Clean(Stk[Tmp]));
}
if(str_cmp(Stk[Tmp],"=")==0)
{
if(str_cmp(Stk[Tmp-1],"<")!=0 && str_cmp(Stk[Tmp-1],">")!=0)
{
if(str_cmp(Stk[Tmp+1],">")!=0 && str_cmp(Stk[Tmp+1],"<")!=0)
{
fprintf(Outfile,"%s","=");
}
}
}
}
NXTTOKEN:;
Tmp++;
if(!IsWhile)
{
if(iMatchWrd(Stk[Tmp],"then"))
{
break;
}
else if(Tmp>Ndx)
{
Abort("If Without THEN");
}
}
if(Tmp>Ndx)
{
break;
}
}
fprintf(Outfile,"%s%s\n",szTest,")");
BumpUp();
fprintf(Outfile,"%s%s\n",Scoot,"{");
BumpUp();
}
void PrintGlobal (int A, int idx, char *Storage, char *P, char *VarName, char *VarDim)
{
char VAR[2048];
for(;;)
{
if(A==vt_FILEPTR)
{
strcpy(VarName,RemoveStr(VarName,"@"));
fprintf(Outfile,"%s%s%s%s%s%s\n",Storage,"FILE *",P,VarName,VarDim,";");
break;
}
if(A==vt_UDT||A==vt_STRUCT||A==vt_UNION)
{
strcpy(VAR,TypeDefs[GlobalVars[idx].VarDef].VarName);
strcpy(VAR,rpad(VAR,7));
fprintf(Outfile,"%s%s%s%s%s%s%s\n",Storage,VAR," ",P,VarName,VarDim,";");
break;
}
if(A==vt_BOOL)
{
fprintf(Outfile,"%s%s%s%s%s\n",Storage,"bool ",VarName,VarDim,";");
break;
}
if(A==vt_STRVAR)
{
if(VarDim[0]==0)
{
strcpy(VarDim,"[65535]");
}
fprintf(Outfile,"%s%s%s%s%s%s\n",Storage,"char ",P,VarName,VarDim,";");
break;
}
if(A>=vt_VarMin&&A<=vt_VarMax)
{
strcpy(VAR,GetVarTypeName(GlobalVars[idx].VarType));
strcpy(VAR,rpad(VAR,7));
fprintf(Outfile,"%s%s%s%s%s%s%s\n",Storage,VAR," ",P,VarName,VarDim,";");
}
break;
}
}
void ReDirectFPrint (FILE* TgtFile, char *pat, ...)
{
va_list ap;
if(DoCountLines&&TgtFile==FP3)
{
gLinesWritten++;
}
va_start(ap,pat);
vfprintf(TgtFile,pat,ap);
va_end(ap);
}
int IsReservedWord (char *match)
{
char mat[2048];
strcpy(mat,ucase(match));
if(containedin(mat,ReservedWord)==0)
{
return 1;
}
return 0;
}
int GetAsPos (void)
{
int i;
for(i=Ndx; i>=2; i+=-1)
{
if(iMatchWrd(Stk[i],"as"))
{
return i;
}
}
return 0;
}
void FreeGlobals (void)
{
if(RmLibs)free(RmLibs);
if(WarnMsg)free(WarnMsg);
if(AbortSrc)free(AbortSrc);
if(Src)free(Src);
if(szTmp)free(szTmp);
}