home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
OS/2 Shareware BBS: 5 Edit
/
05-Edit.zip
/
xmmx.zip
/
source
/
mmmx.cpp
< prev
next >
Wrap
C/C++ Source or Header
|
1996-12-23
|
51KB
|
1,548 lines
/**********************************************
***********************************************
*** Main Editor file, contains commands, ***
*** macro-language & setup stuff ***
***********************************************
**********************************************/
//&<<&MMM headers
#include "mmmgrep.h"
#include "mmm_comm.h"
#ifdef __DOS__
#include "mmm_dos.h"
#endif
#ifdef WIN32
#include "mmm_w95.h"
#endif
#ifdef __OS2__
#include "mmm_os2.h"
#endif
#ifdef __linux__
#ifdef __X11__
#include "mmm_x11.h"
#else
#include "mmm_lnx.h"
#endif
#endif
//&>>&D 0 D 0
//&<<&Global class elements !!!!!! UN-EDIT-ABLE !!!!!!
//&<<&TPair_String_Function CommandArray[LEN_COMMAND_ARRAY]={ /// the first (before editor)
TPair_String_Function CommandArray[LEN_COMMAND_ARRAY]={
TPair_String_Function ( "Ascii0" , MMMlib_Ascii0 ) ,
TPair_String_Function ( "Ascii1" , MMMlib_Ascii1 ) ,
TPair_String_Function ( "Ascii2" , MMMlib_Ascii2 ) ,
TPair_String_Function ( "Space" , MMMlib_Space ) ,
TPair_String_Function ( "Up" , MMMlib_Up ) ,
TPair_String_Function ( "Down" , MMMlib_Down ) ,
TPair_String_Function ( "Left" , MMMlib_Left ) ,
TPair_String_Function ( "Right" , MMMlib_Right ) ,
TPair_String_Function ( "TUp" , MMMlib_TUp ) ,
TPair_String_Function ( "TDown" , MMMlib_TDown ) ,
TPair_String_Function ( "TLeft" , MMMlib_TLeft ) ,
TPair_String_Function ( "TRight" , MMMlib_TRight ) ,
TPair_String_Function ( "PUp" , MMMlib_PUp ) ,
TPair_String_Function ( "PDown" , MMMlib_PDown ) ,
TPair_String_Function ( "FUp" , MMMlib_FUp ) ,
TPair_String_Function ( "FDown" , MMMlib_FDown ) ,
TPair_String_Function ( "FLeft" , MMMlib_FLeft ) ,
TPair_String_Function ( "FRight" , MMMlib_FRight ) ,
TPair_String_Function ( "Enter" , MMMlib_Enter ) ,
TPair_String_Function ( "Tab" , MMMlib_Tab ) ,
TPair_String_Function ( "LTab" , MMMlib_LTab ) ,
TPair_String_Function ( "_InsCh" , MMMlib_InsCh ) ,
TPair_String_Function ( "_DelCh" , MMMlib_DelCh ) ,
TPair_String_Function ( "InsLine" , MMMlib_InsLine ) ,
TPair_String_Function ( "InsFold" , MMMlib_InsFold ) ,
TPair_String_Function ( "DelLine" , MMMlib_DelLine ) ,
TPair_String_Function ( "_BS" , MMMlib_BS ) ,
TPair_String_Function ( "_KillEnd" , MMMlib_KillEnd ) ,
TPair_String_Function ( "_KillBeg" , MMMlib_KillBeg ) ,
TPair_String_Function ( "CSave" , MMMlib_CSave ) ,
TPair_String_Function ( "CMove" , MMMlib_CMove ) ,
TPair_String_Function ( "WSave" , MMMlib_WSave ) ,
TPair_String_Function ( "WMove" , MMMlib_WMove ) ,
TPair_String_Function ( "BWord" , MMMlib_BWord ) ,
TPair_String_Function ( "TSave" , MMMlib_TSave ) ,
TPair_String_Function ( "TMove" , MMMlib_TMove ) ,
TPair_String_Function ( "CRest" , MMMlib_CRest ) ,
TPair_String_Function ( "CClear" , MMMlib_CClear ) ,
TPair_String_Function ( "LSave" , MMMlib_LSave ) ,
TPair_String_Function ( "LTSave" , MMMlib_LTSave ) ,
TPair_String_Function ( "LMove" , MMMlib_LMove ) ,
TPair_String_Function ( "LTMove" , MMMlib_LTMove ) ,
TPair_String_Function ( "LRest" , MMMlib_LRest ) ,
TPair_String_Function ( "LClear" , MMMlib_LClear ) ,
TPair_String_Function ( "Escape" , MMMlib_Escape ) ,
TPair_String_Function ( "EscapeExec" , MMMlib_EscapeExec ) ,
TPair_String_Function ( "EscapeExecLCB" , MMMlib_EscapeExecLCB ) ,
TPair_String_Function ( "ABORT" , MMMlib_ABORT ) ,
TPair_String_Function ( "S_AutoIndent" , MMMlib_S_AutoIndent ) ,
TPair_String_Function ( "S_ModeIns" , MMMlib_S_ModeIns ) ,
TPair_String_Function ( "S_ModeOvr" , MMMlib_S_ModeOvr ) ,
TPair_String_Function ( "S_ACode1" , MMMlib_S_ACode1 ) ,
TPair_String_Function ( "S_ACode2" , MMMlib_S_ACode2 ) ,
TPair_String_Function ( "S_ACode3" , MMMlib_S_ACode3 ) ,
TPair_String_Function ( "S_StatusLine" , MMMlib_S_StatusLine ) ,
TPair_String_Function ( "S_SearchMode" , MMMlib_S_SearchMode ) ,
TPair_String_Function ( "SearchFWD" , MMMlib_SearchFWD ) ,
TPair_String_Function ( "SearchBCK" , MMMlib_SearchBCK ) ,
TPair_String_Function ( "Replace" , MMMlib_Replace ) ,
TPair_String_Function ( "SearchPage" , MMMlib_SearchPage ) ,
TPair_String_Function ( "PageIns" , MMMlib_PageIns ) ,
TPair_String_Function ( "MarkUp" , MMMlib_MarkUp ) ,
TPair_String_Function ( "MarkDown" , MMMlib_MarkDown ) ,
TPair_String_Function ( "MarkTUp" , MMMlib_MarkTUp ) ,
TPair_String_Function ( "MarkTDown" , MMMlib_MarkTDown ) ,
TPair_String_Function ( "MarkPUp" , MMMlib_MarkPUp ) ,
TPair_String_Function ( "MarkPDown" , MMMlib_MarkPDown ) ,
TPair_String_Function ( "MarkSaveB" , MMMlib_MarkSaveB ) ,
TPair_String_Function ( "MarkRestB" , MMMlib_MarkRestB ) ,
TPair_String_Function ( "MarkLast" , MMMlib_MarkLast ) ,
TPair_String_Function ( "MarkFirst" , MMMlib_MarkFirst ) ,
TPair_String_Function ( "MarkPrev" , MMMlib_MarkPrev ) ,
TPair_String_Function ( "MarkNext" , MMMlib_MarkNext ) ,
TPair_String_Function ( "MarkBS" , MMMlib_MarkBS ) ,
TPair_String_Function ( "Macro" , MMMlib_Macro ) ,
TPair_String_Function ( "MacroRec" , MMMlib_MacroRec ) ,
TPair_String_Function ( "Console" , MMMlib_Console )
};
//&>>&16 0 9 0
TKeyArray KeyArray; /// the second (before editor)
TCommandUsrArray CommandUsrArray; /// also before editor
EDITOR Editor; /// must be the last destructor (the previous has NO destructor)
mmm_Screen mmm_screen; /// must be !!BEFORE!! mmm_KBD, bcause of con_fd opening
mmm_KeyBoard mmm_KBD; /// in mmm_Screen::mmm_Screen() (linux console ver.)
//&>>&5 0 5 0
//&<<&Forward_declarations
//&<<&void MemTest(int i){
void MemTest(int i){
if(i)return;
//&<<& #ifdef _ENABLE_LOGGING_
#ifdef _ENABLE_LOGGING_
DoLog(" ........TestMem(%x (%x))\n",i,MinimalExitFromEditor);
#endif
//&>>&0 0 0 B
Beep();
Beep();
if(MinimalExitFromEditor) abort();
MinimalExitFromEditor=1;
exit(1);
}
//&>>&2 0 2 B
//&<<&void Redr(int LineToRedraw)
void Redr(int LineToRedraw){
if(mmm_screen.Need()<LineToRedraw)
mmm_screen.Need()=LineToRedraw;
}
//&>>&2 0 2 12
//&<<&int lower(int c){
int lower(int c){
if(c>='A' && c<='Z') return c+'a'-'A';
return c;
}
//&>>&0 0 0 1A
//&<<&char *getcurdir(int f){ // f -- reread current directory
static char pcGCD_SavedDir[256]="";
unsigned int iGCD_SavedDev=(unsigned int)-1;
//&<<&int SaveGetDrive()
int SaveGetDrive()
{ return iGCD_SavedDev; }
//&>>&1 0 1 1A
//&<<&void SaveChDir(char *s){
void SaveChDir(char *s){
if(strcmp(s,pcGCD_SavedDir)==0) return;
chdir(s);
getcwd(pcGCD_SavedDir,255);
}
//&>>&3 0 3 17
//&<<&void SaveSetDrive(unsigned int n){
void SaveSetDrive(unsigned int n){
if(iGCD_SavedDev==n) return;
iGCD_SavedDev=n;
unsigned int t;
_dos_setdrive(n,&t);
getcwd(pcGCD_SavedDir,255);
}
//&>>&2 0 2 F
//&<<&unsigned int GetSavedDev(){
unsigned int GetSavedDev(){
unsigned int sd;
_dos_getdrive(&sd);
return sd;
}
//&>>&0 0 0 18
char *getcurdir(int f){
if(f){
char *d=new char[strlen(pcGCD_SavedDir)+1];
strcpy(d,pcGCD_SavedDir);
return d;
}else return pcGCD_SavedDir;
}
//&>>&0 0 0 1B
//&>>&1 0 1 1A
//&<<&Constants and variables
int MinimalExitFromEditor=0;
char *templine; // line to be used as temporary strings storage
int fRecordingMacro=0;
Fold *RuntimeStack=NewFold(0);
long RuntimeFlag;
//&>>&7 0 7 3
//&<<&Commands in Canonical form
TMacro *my_macroF7=0; int my_macroF7_ptr=0; /// I must Remove it out of here
//&<<&Movement
// Movement
void MMMlib_Up (int ccode) { cur->Up (); }
void MMMlib_Down (int ccode) { cur->Down (); }
void MMMlib_Left (int ccode) { cur->Left (); }
void MMMlib_Right (int ccode) { cur->Right(); }
void MMMlib_TUp (int ccode) { cur->TUp (); }
void MMMlib_TDown (int ccode) { cur->TDown (); }
void MMMlib_TLeft (int ccode) { cur->TLeft (); }
void MMMlib_TRight (int ccode) { cur->TRight(); }
void MMMlib_PUp (int ccode) { cur->PUp (); }
void MMMlib_PDown (int ccode) { cur->PDown (); }
void MMMlib_FUp (int ccode) { _EXIT(0); }
void MMMlib_FDown (int ccode) { cur->FDown (0); }
//&<<&void MMMlib_FLeft (int ccode) {
void MMMlib_FLeft (int ccode) {
if(Editor.IsInSearchFold)return;
CurrentPage=CurrentPage->PagePrev();
GetCurrentFileNameAndDepth();
Redr();
}
//&>>&2 0 2 8
//&<<&void MMMlib_FRight (int ccode) {
void MMMlib_FRight (int ccode) {
if(Editor.IsInSearchFold)return;
CurrentPage=CurrentPage->PageNext();
GetCurrentFileNameAndDepth();
Redr();
}
//&>>&0 0 0 C
void MMMlib_Enter (int ccode) { cur->_Enter(); }
void MMMlib_Tab (int ccode) { cur->Tab(); }
void MMMlib_LTab (int ccode) { cur->LTab(); }
//&>>&14 0 14 0
//&<<&Insert and delete
// Insert and delete
void MMMlib_InsCh (int ccode) { cur->InsCh (); }
void MMMlib_DelCh (int ccode) { cur->DelCh (); }
void MMMlib_InsLine (int ccode) { cur->InsLine(); }
void MMMlib_InsFold (int ccode) { cur->InsFold(); }
void MMMlib_DelLine (int ccode) { cur->DelLine(); }
void MMMlib_BS (int ccode) { cur->BackSpace();}
//&>>&7 0 7 0
//&<<&Characters/Digits/delimiters Typing
//&<<&void MMMlib_Ascii0 (int ccode) { // for digits
void MMMlib_Ascii0 (int ccode) { // for digits
int code=ccode & 0xff;
int p_alt =((ccode & 0x200)>>8) ^ mmm_f_FixAlt;
int p_shift=((ccode & 0x100)>>8) ^ mmm_f_FixShift;
cur->Ascii(( p_alt ? acode : mcode)[code*2+p_shift]);
}
//&>>&4 0 4 6
//&<<&void MMMlib_Ascii1 (int ccode) { // for letters
void MMMlib_Ascii1 (int ccode) { // for letters
int code=ccode & 0xff;
int p_alt =(((ccode & 0x200)>>8) ^ mmm_f_FixAlt );
int p_shift=(((ccode & 0x100)>>8) ^ mmm_f_FixShift);
cur->Ascii(( p_alt ? acode : mcode)[code*2+p_shift]);
}
//&>>&2 0 2 0
//&<<&void MMMlib_Ascii2 (int ccode) { // for delimiters
void MMMlib_Ascii2 (int ccode) { // for delimiters
int code=ccode & 0xff;
int p_alt =((ccode & 0x200)>>8) ^ mmm_f_FixAlt;
int p_shift=((ccode & 0x100)>>8) ^ mmm_f_FixShift;
cur->Ascii( p_alt ? acode[code*2+ p_shift ] : mcode[code*2+p_shift]); return;
}
//&>>&2 0 2 0
void MMMlib_Space (int ccode) { cur->Ascii(' '); }
//&>>&1 0 1 16
//&<<&Line Killing
// Line Killing
void MMMlib_KillEnd (int ccode) { cur->KillEnd(); }
void MMMlib_KillBeg (int ccode) { cur->KillBeg(); }
//&>>&1 0 1 C
//&<<&Copying of chars
// Copying of chars
void MMMlib_CSave (int ccode) { cur->CCopy(0); }
void MMMlib_CMove (int ccode) { cur->CCopy(1); }
void MMMlib_WSave (int ccode) { cur->BWord(); cur->WCopy(0); }
void MMMlib_WMove (int ccode) { cur->BWord(); cur->WCopy(1); }
void MMMlib_BWord (int ccode) { cur->BWord(); }
void MMMlib_TSave (int ccode) { cur->TCopy(0); }
void MMMlib_TMove (int ccode) { cur->TCopy(1); }
void MMMlib_CRest (int ccode) { cur->CRest(); }
void MMMlib_CClear (int ccode) { CClear(); }
//&>>&9 0 9 C
//&<<&Copying of lines
void MMMlib_LSave (int ccode) { cur->LSave(0); }
void MMMlib_LTSave (int ccode) { cur->LSave(1); }
void MMMlib_LMove (int ccode) { cur->LMove(0); }
void MMMlib_LTMove (int ccode) { cur->LMove(1); }
void MMMlib_LRest (int ccode) { cur->LRest(); }
void MMMlib_LClear (int ccode) { LClear(); }
//&>>&6 0 6 C
//&<<&Various types of exit
// Various types of exit
void MMMlib_Escape (int ccode) { LClear(); __EXIT(); }
void MMMlib_EscapeExec (int ccode) { LClear(); cur->LSave(0); __EXIT(); }
void MMMlib_EscapeExecLCB (int ccode) { __EXIT(); }
//&<<&void MMMlib_ABORT (int ccode) {
void MMMlib_ABORT (int ccode) {
MinimalExitFromEditor=1;
exit(1);
}
//&>>&0 0 0 C
//&>>&4 0 4 C
//&<<&Various switchings (ins/ovr , alt key , status line .........)
// Various switchings (ins/ovr , alt key , status line .........)
void MMMlib_S_AutoIndent (int ccode) { Editor.IndFlag^=1; }
void MMMlib_S_ModeIns (int ccode) { Editor.InsFlag=1; }
void MMMlib_S_ModeOvr (int ccode) { Editor.InsFlag=0; }
void MMMlib_S_ACode1 (int ccode) { mmm_KBD.SetACode(1); }
void MMMlib_S_ACode2 (int ccode) { mmm_KBD.SetACode(2); }
void MMMlib_S_ACode3 (int ccode) { mmm_KBD.SetACode(3); }
void MMMlib_S_StatusLine (int ccode) { Editor.ShowStatusLineFlag^=1; Redr(); }
void MMMlib_S_SearchMode (int ccode) { Editor.SearchMode^=1; }
//&>>&6 0 6 2E
//&<<&Search & replace commands
// Search & replace commands
void MMMlib_SearchFWD (int ccode) { SearchReplaceTextFragment(SEARCH_FORWARD); }
void MMMlib_SearchBCK (int ccode) { SearchReplaceTextFragment(SEARCH_BACK); }
void MMMlib_Replace (int ccode) { SearchReplaceTextFragment(SEARCH_FORWARD,1); }
void MMMlib_SearchPage (int ccode) { SwitchIntoSearchPage(); }
//&>>&4 0 4 C
void MMMlib_PageIns (int ccode) { cur->FDown(1); }
//&<<&Marked Lines Commands
void MMMlib_MarkUp (int ccode) { cur->Up (1); }
void MMMlib_MarkDown (int ccode) { cur->Down (1); }
void MMMlib_MarkTUp (int ccode) { cur->TUp (1); }
void MMMlib_MarkTDown (int ccode) { cur->TDown(1); }
void MMMlib_MarkPUp (int ccode) { cur->PUp (1); }
void MMMlib_MarkPDown (int ccode) { cur->PDown(1); }
void MMMlib_MarkSaveB (int ccode) { SaveMarkedBlock(); }
void MMMlib_MarkRestB (int ccode) { RestMarkedBlock(); }
void MMMlib_MarkLast (int ccode) { LastMarked(); }
void MMMlib_MarkFirst (int ccode) { FirstMarked(); }
void MMMlib_MarkPrev (int ccode) { PrevMarked(); }
void MMMlib_MarkNext (int ccode) { NextMarked(); }
void MMMlib_MarkBS (int ccode) { LastMarked(); cur->MarkLine(); }
//&>>&C 0 C C
//&<<&MacroCommands
void MMMlib_Macro(int ccode){
static int i=-1;
if(fRecordingMacro){
fRecordingMacro=0;
(*my_macroF7)[my_macroF7_ptr-1]=0;
i=CommandUsrArray.AddEntry("MacroF7",my_macroF7);
return;
}
CommandUsrArray.base[i].Execute(ccode);
}
void MMMlib_MacroRec(int ccode){
if(my_macroF7!=0)delete my_macroF7;
my_macroF7=new TMacro;
fRecordingMacro=1;
(*my_macroF7)[0]=MACRO_KEYSEQ;
my_macroF7_ptr=1;
}
//&>>&9 0 9 0
//&>>&4 0 4 0
//&<<&TCommand.. / TKey / TMacro / TPair_String_Int
//&<<&int TKeyArray::AddEntry(int _scan, int _fnum){
int TKeyArray::AddEntry(int _scan, int _fnum){
int i;
for(i=0; i<lbase ; i++){
if(base[i].fnum==-1) goto l_ka_InsertData;
}
TKey *base1;
lbase+=0x100;
base1=new TKey[lbase]; MemTest(base1!=0);
if(base!=0){
memcpy(base1, base, i * sizeof(TKey) );
delete base;
}
base=base1;
l_ka_InsertData:
base[i].scan = _scan ;
base[i].fnum = _fnum ;
return i;
}
//&>>&3 0 3 13
//&<<&int TCommandUsrArray::AddEntry(char *_fname, TMacro *_fcode) {
int TCommandUsrArray::AddEntry(char *_fname, TMacro *_fcode) {
// TCommandUsr {
// char *fName;
// short *fCode; };
// the end of vector is unnamed function (fName==0)
int i,j;
for(i=0; i<lbase ; i++){
if(base[i].fName==0) goto l_cua_InsertName;
if(strcmp(base[i].fName, _fname)==0) goto l_cua_InsertContents;
}
TCommandUsr *base1;
lbase+=0x100;
base1=new TCommandUsr[lbase]; MemTest(base1!=0);
if(base!=0){
memcpy(base1, base, i * sizeof(TCommandUsr) );
delete base;
}
base=base1;
l_cua_InsertName:
base[i].fName=new char[strlen(_fname)+1]; MemTest( base[i].fName!=0 );
strcpy (base[i].fName , _fname );
l_cua_InsertContents:
if(_fcode!=0){
for(j=0;j<_fcode->lbase;j++){
base[i].fCode[j]=(*_fcode)[j];
}
}
return i;
}
//&>>&9 0 9 D
//&<<&short &TMacro::operator[](int idx) {
short &TMacro::operator[](int idx) {
if(idx>=lbase){
int i;
short *base1;
lbase+=0x10;
base1=new short[lbase]; MemTest(base1!=0);
if(base!=0){
memcpy(base1, base, (lbase-0x10) * sizeof(short) );
delete base;
}
base=base1;
for(i=lbase-0x10;i<lbase;i++) base[i]=0;
}
return base[idx];
}
//&>>&0 0 0 15
//&<<&int TCommandUsr::Execute(int arg){
int TCommandUsr::Execute(int arg) {
int pc;
if(fCode.base==0)return -1;
switch(fCode[0]){
case MACRO_PROC:
for(pc=1; fCode[pc]!=0 && fCode[pc]!=TKN_RETURN_ ; pc++) {
//&<<& if(fCode[pc]<LEN_LANGUAGE){ // if, do, ... analisys
if(fCode[pc]>=0 && fCode[pc]<LEN_LANGUAGE){
Line *nl;
// char *tpc;
int i,l;
switch(fCode[pc]){
case TKN_GOTO_:
pc=fCode[pc+1]-1;
break;
case TKN_IF_:
if(RuntimeFlag) pc++;
else pc=fCode[pc+1]-1;
break;
//&<<& case TKN_CONST_INT_:
case TKN_CONST_INT_:
nl=NewLine(0);
nl->linenumber=fCode[++pc];
nl->type=SDATA_INT;
nl->LinkBefore(RuntimeStack->pos);
RuntimeStack->pos=nl;
break;
//&>>&7 0 7 15
//&<<& case TKN_CONST_STRING_:
case TKN_CONST_STRING_:
templine=new char[(l=fCode[++pc])+1]; MemTest(templine!=0);
for(i=0;i<l;i++)templine[i]=char(fCode[++pc]);
templine[i]=0;
nl=NewLine(templine);
delete templine;
nl->type=SDATA_STRING;
nl->LinkBefore(RuntimeStack->pos);
RuntimeStack->pos=nl;
break;
//&>>&1 0 1 4D
case TKN_SWP_ :
RuntimeStack->stackSwp();
break;
case TKN_DUP_ :
RuntimeStack->stackDup();
break;
case TKN_DEL_ :
RuntimeStack->stackDel();
break;
case TKN_SGET_:
RuntimeStack->stackSget();
break;
case TKN_SPUT_:
RuntimeStack->stackSput();
break;
case TKN_POP_:
RuntimeStack->stackPop();
break;
case TKN_PUSH_:
RuntimeStack->stackPush();
break;
case TKN_CONVERT_:
RuntimeStack->stackConvert();
break;
case TKN_MATHOP_:
RuntimeStack->stackMathOperation();
break;
case TKN_PREDICATE_:
RuntimeStack->stackPredicate();
break;
case TKN_IOCTL_:
RuntimeStack->stackIOCTL();
break;
case TKN_QUERY_:
RuntimeStack->stackQuery();
break;
case TKN_EVAL_:
RuntimeStack->stackEval();
break;
}
// here must be analisys of Language Constructions
// if , do , ...
// HERE "pc" may be modifyed
continue;
}
//&>>&34 0 1D 0
//&<<& if(fCode[pc]>=LEN_LANGUAGE && fCode[pc]<USER_FUNC){ // MMMlib
if(fCode[pc]>=LEN_LANGUAGE && fCode[pc]<USER_FUNC){
CommandArray[fCode[pc]-LEN_LANGUAGE].fRef(arg);
continue;
}
//&>>&1 0 1 0
//&<<& if(fCode[pc]>=USER_FUNC && fCode[pc]<USER_FUNC+CommandUsrArray.lbase ) {
if(fCode[pc]>=USER_FUNC && fCode[pc]<USER_FUNC+CommandUsrArray.lbase ){
arg=CommandUsrArray.base[fCode[pc]-USER_FUNC].Execute(arg);
continue;
}
//&>>&1 0 1 12
}
break;
case MACRO_KEYSEQ:
for(pc=1; fCode[pc]!=0 ; pc++) Command(fCode[pc]);
break;
}
Redr();
return arg;
}
//
// rules of storing macrocommand in "short *"<==>(TMacro) vector:
// 0 -- macro end
// [ 1 , LEN_LANGUAGE ) -- language constructions (if, else, ...)
// /* #define USER_FUNC (LEN_LANGUAGE+LEN_COMMAND_ARRAY) */
// [ LEN_LANGUAGE , USER_FUNC ) -- MMMlib
// [ USER_FUNC , INFTY ] -- functions from *MACRO* fold
//&>>&6 0 6 F
//&<<&int fPair_String2Int (TPair_String_Int psArr[], int len, const char *pcNam) {
int fPair_String2Int (TPair_String_Int psArr[], int len, const char *pcNam) {
// returns position of "pcNam" string in "psArr" array
// or -1 if NotIn
for(int i=0;i<len;i++)
if(0==strcmp(pcNam, psArr[i].fName))return psArr[i].iValue;
return -1;
}
//&>>&0 0 0 5
//&<<&char *fPair_Int2String(TPair_String_Int psArr[], int len, int iIdx ) {
char *fPair_Int2String(TPair_String_Int psArr[], int len, int iIdx ) {
for(int i=0;i<len;i++)
if(iIdx==psArr[i].iValue)return psArr[i].fName;
return 0;
}
//&>>&2 0 2 0
//&<<&void mmm_ExecuteCommand(char *_cmd, int arg, int _rstXY){
void mmm_ExecuteCommand(char *_cmd, int arg, int _rstXY){
// execute command _cmd
// _rst=0 -- do not restore cursor position to original
// _rst=1 -- restore cursor position to original
int iCur_sx=cur->sx;
int iCur_cx=cur->cx;
int iCur_sy=cur->sy;
int i;
// search in MMMlib:
for(i=0;i<LEN_COMMAND_ARRAY;i++){
if( 0==strcmp(CommandArray[i].fName,_cmd) ){
CommandArray[i].fRef(arg);
goto lbl_EC_quit;
}
}
// search in USRlib:
for(i=0;i<CommandUsrArray.lbase && CommandUsrArray.base[i].fName!=0 ;i++){
if( 0==strcmp(CommandUsrArray.base[i].fName,_cmd) ){
CommandUsrArray.base[i].Execute(arg);
goto lbl_EC_quit;
}
}
lbl_EC_quit:
if(_rstXY){
cur->sx=iCur_sx;
cur->cx=iCur_cx;
cur->sy=iCur_sy;
}
}
//&>>&0 0 0 39
//&>>&9 0 9 6
//&<<&compiler
//&<<&char *ScanLanguageWord(FILE *fptr){
char *ScanLanguageWord(FILE *fptr){
static int FoldDepth;
char *body;
static char *tline=0, *lptr=0;
int i=0;
//&<<& if(fptr!=0 && tline==0){
if(fptr!=0 && tline==0){
FoldDepth=0;
tline=new char[0x100]; MemTest(tline!=0);
lptr=tline;
*lptr=0;
}
//&>>&1 0 1 0
if(fptr==0 && tline!=0) goto l_ShutdownScanner;
do{
if(*lptr==0){
if(fgets(tline,0x100,fptr)==0)goto l_ShutdownScanner;
if( Editor.IsComment(tline,"&<<&") ) FoldDepth++;
else if( Editor.IsComment(tline,"&>>&") ) FoldDepth--;
if(FoldDepth<0) goto l_ShutdownScanner;
lptr=tline;
}
else{
while(*lptr<=' '&& *lptr)lptr++;
switch(*lptr){
case '\"': case '\'':
for(i=1; lptr[i]!=0 && lptr[i]!='\"' && lptr[i]!='\'' ; i++)
if(lptr[i]>0 && lptr[i]<' ')lptr[i]=' ';
if(lptr[i]!=0)i++;
break;
case 0x25: case 0: // % & 0
*lptr=0;
i=0;
default:
for(i=0; lptr[i]>' '; i++);
}
}
}while(i==0);
body=new char[i+1];
memcpy(body, lptr, i * sizeof(char) ); body[i]=0;
for(lptr+=i; *lptr!=0 && *lptr<=' '; lptr++);
return body;
l_ShutdownScanner:
delete tline;
tline=lptr=0;
return 0;
}
//&>>&0 0 0 2D
//&<<&int TestToken(char *lptr){
///////// supp_mmm.cpp supp_mmm.cpp supp_mmm.cpp supp_mmm.cpp
#define LENGTH_sToken2tId (22)
//&<<&TPair_String_Int psToken2tId[LENGTH_sToken2tId]={
TPair_String_Int psToken2tId[LENGTH_sToken2tId]={
// TPair_String_Int("CONST_CHAR_" , TKN_CONST_CHAR_ ) ,
// TPair_String_Int("CONST_INT_" , TKN_CONST_INT_ ) ,
// TPair_String_Int("CONST_STRING_" , TKN_CONST_STRING_ ) ,
// TPair_String_Int("GOTO_" , TKN_GOTO_ ) ,
// TPair_String_Int("CALL_" , TKN_CALL_ ) ,
TPair_String_Int("proc" , TKN_PROC_ ) ,
TPair_String_Int("endp" , TKN_ENDP_ ) ,
TPair_String_Int("if" , TKN_IF_ ) ,
TPair_String_Int("else" , TKN_ELSE_ ) ,
TPair_String_Int("endif" , TKN_ENDIF_ ) ,
TPair_String_Int("do" , TKN_DO_ ) ,
TPair_String_Int("enddo" , TKN_ENDDO_ ) ,
TPair_String_Int("break" , TKN_BREAK_ ) ,
TPair_String_Int("ret" , TKN_RETURN_ ) ,
TPair_String_Int("swp" , TKN_SWP_ ) ,
TPair_String_Int("dup" , TKN_DUP_ ) ,
TPair_String_Int("del" , TKN_DEL_ ) ,
TPair_String_Int("sget" , TKN_SGET_ ) ,
TPair_String_Int("sput" , TKN_SPUT_ ) ,
TPair_String_Int("mathop" , TKN_MATHOP_ ) ,
TPair_String_Int("predicate" , TKN_PREDICATE_) ,
TPair_String_Int("convert" , TKN_CONVERT_ ) ,
TPair_String_Int("query" , TKN_QUERY_ ) ,
TPair_String_Int("pop" , TKN_POP_ ) ,
TPair_String_Int("push" , TKN_PUSH_ ) ,
TPair_String_Int("ioctl" , TKN_IOCTL_ ) ,
TPair_String_Int("eval" , TKN_EVAL_ ) };
//&>>&1C 0 1C 0
int TestToken(const char *lptr){
if(*lptr=='\"')return TKN_CONST_STRING_;
if(*lptr=='\'')return TKN_CONST_CHAR_;
if( (*lptr=='-' && lptr[1]>='0' && lptr[1]<='9') ||
(*lptr>='0' && *lptr<='9') )
return TKN_CONST_INT_;
int i=fPair_String2Int( psToken2tId, LENGTH_sToken2tId, lptr);
return (i>=0)?i:TKN_CALL_;
}
//&>>&3 0 3 1C
//&<<&void Compile(FILE *fptr){
void Compile(FILE *fptr){
int i,l;
char *tk;
int cstat=TKN_INITIAL_;
int ttype;
char *FuncName;
TMacro *ctStack, *mb;
int p,np;
while( (tk=ScanLanguageWord(fptr))!=0 ) {
ttype=TestToken(tk);
switch(cstat){
//&<<& case TKN_INITIAL_:
case TKN_INITIAL_:
if(ttype==TKN_PROC_){
cstat=TKN_PROC_;
}
break;
//&>>&2 0 2 2E
//&<<& case TKN_PROC_:
case TKN_PROC_:
ctStack=new TMacro;
mb=new TMacro;
FuncName=new char[strlen(tk)+1];
MemTest(mb!=0 && ctStack!=0 && FuncName!=0);
strcpy(FuncName,tk);
(*mb)[0]=MACRO_PROC;
p=1; np=0;
cstat=TKN_INPROC_;
break;
//&>>&A 0 A E
//&<<& case TKN_INPROC_:
case TKN_INPROC_:
switch(ttype){
//&<<& case TKN_ENDP:
case TKN_ENDP_:
CommandUsrArray.AddEntry(FuncName,mb);
delete FuncName;
delete mb;
delete ctStack;
cstat=TKN_INITIAL_;
p=np=0;
break;
//&>>&5 0 5 23
//&<<& case TKN_IF, TKN_ELSE, TKN_ENDIF
case TKN_IF_:
(*mb)[p++]=TKN_IF_;
(*ctStack)[++np]=p++;
break;
case TKN_ELSE_:
(*mb)[p++]=TKN_GOTO_;
(*mb)[(*ctStack)[np]]=p+1;
(*ctStack)[np]=p++;
break;
case TKN_ENDIF_:
(*mb)[(*ctStack)[np--]]=p;
break;
//&>>&9 0 9 0
//&<<& case TKN_DO, TKN_ENDDO
case TKN_DO_:
(*mb)[p++]=TKN_IF_;
(*ctStack)[++np]=p++;
break;
case TKN_ENDDO_:
(*mb)[p++]=TKN_GOTO_;
(*mb)[p++]=(*ctStack)[np]-1;
(*mb)[(*ctStack)[np--]]=p;
break;
//&>>&6 0 6 2A
//&<<& case TKN_CONST_CHAR, TKN_CONST_NUMBER, TKN_CONST_STRING:
case TKN_CONST_CHAR_:
(*mb)[p++]=TKN_CONST_INT_;
(*mb)[p++]=tk[1];
break;
case TKN_CONST_INT_:
(*mb)[p++]=TKN_CONST_INT_ ;
(*mb)[p++]=short(strtol(tk,0,16));
break;
case TKN_CONST_STRING_:
l=strlen(tk);
(*mb)[p++]=TKN_CONST_STRING_;
(*mb)[p++]=l-2;
for(i=1;i<l-1;i++)(*mb)[p++]=tk[i];
break;
//&>>&0 0 0 0
//&<<& case TKN_CALL_:
case TKN_CALL_:
for(i=0;i<LEN_COMMAND_ARRAY;i++)
if(strcmp(CommandArray[i].fName,tk)==0)break;
if(i<LEN_COMMAND_ARRAY)
i+=LEN_LANGUAGE;
else
i=CommandUsrArray.AddEntry(tk)+USER_FUNC;
(*mb)[p++]=i;
break;
//&>>&0 0 0 8
//&<<& default: // Arithm, pred, eval, ... functions
default:
(*mb)[p++]=ttype;
break;
//&>>&1 0 1 0
}
//&>>&7 0 7 2C
}
delete tk;
}
}
//&>>&E 0 E 1D
//&>>&2 0 2 1A
//&<<&RuntimeStack functions
// mmmx.h
//&<<&void Fold::stackSwp() { ok
void Fold::stackSwp() {
Line *ff=pos->next;
if(ff==0)return;
ff->UnLink();
ff->LinkBefore(pos);
pos=ff;
}
//&>>&5 0 5 0
//&<<&void Fold::stackDel() { ok
void Fold::stackDel() {
Line *ff=pos;
pos=pos->next;
delete ff;
}
//&>>&2 0 2 0
//&<<&void Fold::stackDup() { ok
void Fold::stackDup() {
Line *ff=pos->Copy(1);
ff->LinkBefore(pos);
pos=ff;
}
//&>>&0 0 0 0
//&<<&void Fold::stackSget() { ok
void Fold::stackSget() {
if(pos->type!=SDATA_INT)return;
Line *nl;
Line *optr;
int dpth=pos->linenumber;
stackDel();
optr=pos;
while(--dpth > 0){ if(0==(optr=optr->next))return; }
nl=optr->Copy(1);
nl->LinkBefore(pos);
pos=nl;
}
//&>>&B 0 B 4
//&<<&void Fold::stackSput() { ok
void Fold::stackSput() {
if(pos->type!=SDATA_INT)return;
// Line *nl;
Line *optr,*oput;
int dpth=pos->linenumber;
stackDel();
oput=pos; optr=pos=pos->next;
oput->UnLink();
while(--dpth > 0){ if(0==(optr=optr->next))return; }
oput->LinkBefore(optr);
delete optr;
}
//&>>&A 0 A 0
//&<<&Line *Fold::TestTopOfTheStackIsInt() { ok
Line *Fold::TestTopOfTheStackIsInt() {
Line *nxt=pos->next;
if(nxt==0)return 0;
Line *nnxt=nxt->next;
if( pos->type!=SDATA_INT || nxt->type!=SDATA_INT ||
nnxt==0 || nnxt->type!=SDATA_INT )return 0;
return nnxt; // 2-nd argument
}
//&>>&4 0 4 1C
//&<<&void Fold::stackMathOperation() { ok
void Fold::stackMathOperation() {
Line *nnext=TestTopOfTheStackIsInt();
if(nnext==0)return;
long val1=pos->next->linenumber;
long val2=nnext->linenumber;
long valr;
switch(pos->linenumber) {
case MATHOP_SUB:
valr=val2 - val1;
break;
case MATHOP_MUL:
valr=val2 * val1;
break;
case MATHOP_DIV:
valr=val2 / val1;
break;
case MATHOP_MOD:
valr=val2 % val1;
break;
case MATHOP_AND:
valr=val2 & val1;
break;
case MATHOP_OR:
valr=val2 | val1;
break;
case MATHOP_XOR:
valr=val2 ^ val1;
break;
default: /// case MATHOP_ADD: (as default, for idiots)
valr=val2 + val1;
break;
}
pos->linenumber=valr;
delete pos->next;
delete pos->next;
}
//&>>&25 0 1A 2
//&<<&void Fold::stackPredicate() { ok
void Fold::stackPredicate() {
Line *nnext=TestTopOfTheStackIsInt();
if(nnext==0)return;
int val1=pos->next->linenumber;
int val2=nnext->linenumber;
switch(pos->linenumber) {
case PREDICATE_EQ:
RuntimeFlag=(val2 == val1)?1:0;
break;
case PREDICATE_LT:
RuntimeFlag=(val2 < val1)?1:0;
break;
case PREDICATE_GT:
RuntimeFlag=(val2 > val1)?1:0;
break;
default: /// case PREDICATE_NE: (by default, for idiots)
RuntimeFlag=(val2 != val1)?1:0;
break;
}
stackDel(); // kill operation type
stackDel(); // kill 1-st agrument
stackDel(); // kill 2-nd agrument
}
//&>>&0 0 0 0
//&<<&void Fold::stackQuery() { ok
void Fold::stackQuery() {
Line *pp=NewLine(0);
pp->type=SDATA_INT;
pp->linenumber=pos->type;
pp->LinkBefore(pos);
pos=pos->prev;
}
//&>>&2 0 2 0
//&<<&void Fold::stackConvert() { ok
void Fold::stackConvert() {
if(pos->type!=SDATA_INT)return;
short ct=short(pos->linenumber);
stackDel();
long n;
char *ts;
Line *nl;
switch(ct){
case CONVERT_I2SH:
case CONVERT_I2SD:
case CONVERT_I2C:
if(pos->type!=SDATA_INT)return;
ts=new char[0x10]; MemTest(ts!=0);
sprintf(ts,
(ct==CONVERT_I2SH)?"%x":
(ct==CONVERT_I2SD)?"%d":"%c"
,int(pos->linenumber));
nl=NewLine(ts);
nl->type=SDATA_STRING;
delete ts;
break;
case CONVERT_S2IH:
case CONVERT_S2ID:
case CONVERT_C2I:
if(pos->type!=SDATA_STRING)return;
if(ct==CONVERT_C2I) n=pos->buf[0];
else n=strtol( pos->buf, 0, (ct==CONVERT_S2IH)?16:10 );
nl=NewLine(0);
nl->linenumber=n;
nl->type=SDATA_INT;
break;
case CONVERT_S2L:
if(pos->type!=SDATA_STRING)return;
pos->type=SDATA_LINE;
return;
case CONVERT_L2S:
if(pos->type!=SDATA_LINE)return;
pos->type=SDATA_STRING;
return;
}
nl->LinkBefore(pos);
delete pos;
pos=nl;
}
//&>>&2B 0 17 B
//&<<&void Fold::stackPop() { ok
void Fold::stackPop() {
int i;
Line *ff;
switch(pos->type){
case SDATA_LINE:
ff=pos;
pos=pos->next;
ff->UnLink();
ff->LinkBefore(cur->pos);
cur->pos=ff;
return; // !!NOT break!!
case SDATA_INT:
RuntimeFlag=pos->linenumber;
break;
case SDATA_STRING:
for(i=0;*(pos->Buf(i));i++) cur->Ascii(*(pos->Buf(i)));
break;
}
stackDel();
}
//&>>&13 0 13 B
//&<<&void Fold::stackPush() { ok
void Fold::stackPush() {
// char aa[2];
Line *nl;
int itPush=pos->linenumber;
stackDel();
switch(itPush){
case PUSH_FLAG :
nl=NewLine(0);
nl->linenumber=RuntimeFlag;
nl->type=SDATA_INT;
break;
case PUSH_CLINE_L :
nl=cur->pos->Copy();
nl->type=SDATA_LINE;
break;
case PUSH_CLINE_S :
nl=NewLine(cur->pos->buf);
nl->type=SDATA_STRING;
break;
case PUSH_CCB :
nl=NewLine(mmm_CharClipboard.buf);
nl->type=SDATA_STRING;
break;
case PUSH_LCB :
nl=fLineClipboard->Copy();
nl->type=SDATA_LINE;
break;
case PUSH_CHAR :
nl=NewLine(0);
nl->linenumber=byte(cur->GetCh());
nl->type=SDATA_INT;
break;
}
nl->LinkBefore(pos);
pos=nl;
}
//&>>&23 0 17 B
//&<<&void Fold::stackIOCTL() { ok
void Fold::stackIOCTL() {
Line *nl;
// int i;
int itF=pos->linenumber;
stackDel();
switch(itF){
case IOCTL_MODEINS : // query insert mode
RuntimeFlag=Editor.InsFlag;
return;
case IOCTL_MODEAI : // query autoindent mode
RuntimeFlag=Editor.IndFlag;
return;
case IOCTL_MODESEARCH: // query search mode
RuntimeFlag=Editor.SearchMode;
return;
case IOCTL_MODECAPS : // query CAPS
RuntimeFlag=mmm_f_FixShift;
return;
case IOCTL_MODEALT : // query ALT
RuntimeFlag=mmm_f_FixAlt;
return;
case IOCTL_ISFOLD : // query if current line is fold?
RuntimeFlag=(cur->pos->Enter()!=0);
return;
case IOCTL_ISMARKED : // query if current line is marked
RuntimeFlag=cur->pos->marked;
return;
case IOCTL_ISLAST : // query if current line is last
RuntimeFlag=(cur->pos->next==0);
return;
case IOCTL_INSEARCH : // query if in {\tt SearchPage}.
RuntimeFlag=Editor.IsInSearchFold;
return;
case IOCTL_INTEMP : // query if in {\tt *TEMP*}.
RuntimeFlag=(CurrentPage==ConstantPage);
return;
case IOCTL_MAXY : // Put HEIGHT on stack
nl=NewLine(0);
nl->type=SDATA_INT;
nl->linenumber=mmm_screen.GetH();
break;
case IOCTL_MAXX : // Put WIDTH on stack
nl=NewLine(0);
nl->type=SDATA_INT;
nl->linenumber=mmm_screen.GetW();
break;
case IOCTL_CX : // put cx on stack
nl=NewLine(0);
nl->type=SDATA_INT;
nl->linenumber=cur->cx;
break;
case IOCTL_SX : // put sx on stack
nl=NewLine(0);
nl->type=SDATA_INT;
nl->linenumber=cur->sx;
break;
case IOCTL_SY : // put sy on stack
nl=NewLine(0);
nl->type=SDATA_INT;
nl->linenumber=cur->sy;
break;
case IOCTL_LINENUM : // put linenumber on stack
nl=NewLine(0);
nl->type=SDATA_INT;
nl->linenumber=cur->pos->linenumber;
break;
}
nl->LinkBefore(pos);
pos=nl;
}
//&>>&46 0 24 0
//&<<&void Fold::stackEval() {
void Fold::stackEval() {
// stack->top - int!=0 Do for all marked
// command under stack->top
int fDoMarked=0;
int arg=0;
//&<<& if(pos->type==SDATA_INT){
if(pos->type==SDATA_INT){
if(pos->linenumber!=0){ arg=pos->linenumber; fDoMarked=1; }
stackDel();
}
//&>>&1 0 1 0
if(pos->type!=SDATA_STRING)return;
Line *_pos=cur->pos;
if(fDoMarked){
MarkedLine *f=MarkedBlock;
while(f->Prev()){
f=f->Prev();
if(f->ref!=_pos){
cur->pos=f->ref;
mmm_ExecuteCommand(pos->buf, arg, 1);
}
}
cur->pos=_pos;
}
mmm_ExecuteCommand(pos->buf, arg);
stackDel();
}
//&>>&7 0 7 0
//&>>&10 0 10 16
void Process(){ for(;;) MkScan(mmm_KBD.GetScan()); }
//&<<&void Command(short MMMscan){
void Command(short MMMscan){
if(MMMscan==0) return;
if(fRecordingMacro) (*my_macroF7)[my_macroF7_ptr++]=MMMscan;
int i,fnum;
for(i=0;i<KeyArray.lbase;i++){
fnum=KeyArray.base[i].fnum;
if(fnum==-1) break;
if(KeyArray.base[i].scan==MMMscan)
{
if(fnum<LEN_COMMAND_ARRAY)
CommandArray[fnum].fRef(MMMscan);
else
CommandUsrArray.base[fnum-LEN_COMMAND_ARRAY].Execute(MMMscan);
return;
}
}
}
//&>>&3 0 3 B
//&<<&EDITOR functions
//&<<&int EDITOR::IsComment(char *buf,char *ptrn);
int EDITOR::IsComment(char *buf,char *ptrn){
if(buf==0) return 0;
if(memcmp(buf,comment,lcomment)) return 0;
if(memcmp(buf+lcomment,ptrn,strlen(ptrn))) return 0;
return 1;
}
//&>>&3 0 3 6
//&<<&void EDITOR::SetComment(char *n);
void EDITOR::SetComment(char *name){
int i,j,k;
for(i=0;name[i];i++) if(name[i]=='.'){ i++; break; }
for(j=0;j<nExt;j++){
for(k=0;name[i+k];k++) if(lower(FileExt[j][k])!=lower(name[i+k])) break;
if(name[i+k]==0 && FileExt[j][k]==0){
comment=FileCmt[j]; lcomment=strlen(comment); return;
}
}
comment=""; lcomment=0;
}
//&>>&0 0 0 8
//&<<&void EDITOR::Init_ExtensionsFold2Mem(Fold *ExtFold){
void EDITOR::Init_ExtensionsFold2Mem(Fold *ExtFold){
int i, k, fldd;
Line *pp=ExtFold->pos;
while(pp->next)pp=pp->next;
for(nExt=0;pp->prev;nExt++)pp=pp->prev;
FileExt=new char*[nExt]; MemTest(FileExt!=0);
FileCmt=new char*[nExt]; MemTest(FileCmt!=0);
for(i=0;pp && i<nExt;i++){
fldd=0;
FileExt[i]=new char[4]; MemTest(FileExt[i]!=0);
FileCmt[i]=new char[8]; MemTest(FileCmt[i]!=0);
for(k=0;*(pp->Buf(k))!=0;k++){
if(*(pp->Buf(k))==' ' && !fldd){
strncpy(FileExt[i], pp->Buf(0), k); FileExt[i][k]=0;
fldd=k+1;
}
}
strncpy(FileCmt[i], pp->Buf(fldd), k+1-fldd);
FileCmt[i][k+1-fldd]=0;
pp=pp->next;
}
}
///const nExt=13;
///char *FileExt[nExt]={"h" ,"hpp","c" ,"cpp","tex","bat" ,"asm","sty","prg","ch","" ,"rc","sys"};
///char *FileCmt[nExt]={"//","//" ,"//","//" ,"%" ,"@rem ",";" ,"%" ,"//" ,"//","#","//","Rem "};
//&>>&1C 0 1C 6
//&<<&void EDITOR::Init_keymapFold2Mem(FILE *fptr) {
void EDITOR::Init_keymapFold2Mem(FILE *fptr) {
int i=0,l,j;
for(;fgets(templine,0xff,fptr)!=0;i++){
if ( Editor.IsComment(templine,"&>>&") ) return;
if(i==0){
l=strlen(templine);
for(j=0;j<l;j+=2){ // read altcase table
mmm_KBD.AltCase[templine[j]] =templine[j+1];
mmm_KBD.AltCase[templine[j+1]] =templine[j];
}
continue;
}
if(i<5) memcpy(mmm_KBD.keys[i-1],templine,128*sizeof(char)); // read keytable
}
}
//&>>&C 0 C 0
//&<<&void EDITOR::Init_SetupFold2Mem() {
void EDITOR::Init_SetupFold2Mem(FILE *fptr) {
char *s;
int i;
while(fgets(templine,0xff,fptr)!=0){
if( Editor.IsComment(templine,"&>>&") ) return;
if(memcmp(templine,"Attrs=",6)==0){
s=templine+6;
for(i=0;i<NAttr;i++) Attrs[i]=int(strtol(s,&s,16));
}
if(memcmp(templine,"Params=",7)==0){
s=templine+7;
for(i=0;i<NParams;i++) Params[i]=int(strtol(s,&s,16));
}
}
}
//&>>&B 0 B D
//&<<&void EDITOR::Init_CommandFold2Mem(FILE *fptr) {
void EDITOR::Init_CommandFold2Mem(FILE *fptr) {
//// This function is called only from EDITOR::InitEditorSetup,
//// Where 'templine' is already allocated!
//// if(strcmp(templine,"&<<&*COMMAND*\n")==0) Init_CommandFold2Mem();
char *s;
int nl,i;
int _scan;
while(fgets(templine,0xff,fptr)!=0){
if( Editor.IsComment(templine,"&>>&") ) return;
s=templine;
_scan=int(strtol(s,&s,16));
while(*s<=' ')s++;
for(nl=0 ; s[nl]>' '; nl++); s[nl]=0;
for(i=0;i<LEN_COMMAND_ARRAY;i++){
if(strcmp(CommandArray[i].fName,s)==0){
KeyArray.AddEntry(_scan, i);
break;
}
}
if(i>=LEN_COMMAND_ARRAY){ // Notfound in MMMLIB, add to UsrLib.
i=CommandUsrArray.AddEntry(s,0);
KeyArray.AddEntry(_scan, LEN_COMMAND_ARRAY+i);
}
}
}
//&>>&16 0 11 0
//&<<&void EDITOR::Init_MacroFold2Mem(FILE *fptr) {
//&>>&0 0 0 2
//&<<&EDITOR::EDITOR();
EDITOR::EDITOR(){
//&<<ifdef _ENABLE_LOGGING_
#ifdef _ENABLE_LOGGING_
{
FILE *flog=fopen("log.","w");
if(flog){ fputs("MM2 LogFile\n",flog); fclose(flog); }
}
#endif
//&>>&0 0 0 0
IsInSearchFold=0; attrs=Attrs;
}
//&>>&1 0 1 8
//&<<&void EDITOR::InitFirstPage()
void EDITOR::InitFirstPage()
{
cur=new Fold("*TEMP*");
cur->top=0;
CurrentPage=new Chain(cur);
CurrentPage->next=CurrentPage;
CurrentPage->prev=CurrentPage;
ConstantPage=CurrentPage;
NumberOfPages=1;
}
//&>>&0 0 0 7
//&<<&void EDITOR::InitUserSetup() {
void EDITOR::InitUserSetup() {
FILE *f;
InitialDir=getcurdir();
//&<<& UserSetup Folds Init
MarkedBlock=new MarkedLine("*ML*");
SearchFold=new Fold("*SEARCH*"); SearchFold->top=0;
mmm_LineClipboard=NewLine(0);
fLineClipboard=new Fold("*LCB*");
fLineClipboard->pos=mmm_LineClipboard;
InitFirstPage();
//&>>&5 0 5 5
templine=new char[INFTY+1]; MemTest(templine!=0);
comment=""; lcomment=0;
f=fopen(ConfigFileName,"r"); if(f==0)return;
while(fgets(templine,INFTY,f)!=0){
//&<<& if(strcmp(templine,"&<<&*SEARCH*\n")==0){
if(strcmp(templine,"&<<&*SEARCH*\n")==0){
SearchFold->Read(f,FILE_FOLD);
}
//&>>&1 0 1 0
//&<<& if(strcmp(templine,"&<<&*TEMP*\n")==0){
if(strcmp(templine,"&<<&*TEMP*\n")==0){
cur->Read(f,FILE_FOLD);
}
//&>>&1 0 1 C
//&<<& if(strcmp(templine,"&<<&*LCB*\n")==0){
if(strcmp(templine,"&<<&*LCB*\n")==0){
fLineClipboard->Read(f,FILE_FOLD);
}
//&>>&1 0 1 D
}
fclose(f);
while(mmm_LineClipboard->prev) mmm_LineClipboard=mmm_LineClipboard->prev;
delete templine;
}
//&>>&D 0 D 0
//&<<&void EDITOR::InitEditorSetup(){
void EDITOR::InitEditorSetup(){
FILE *f;
SetDefaultAttributes();
//&<<& ExtensionsFold
Fold *ExtensionsFold=new Fold("*EXTENSIONS*");
ExtensionsFold->pos=NewLine(0);
//&>>&0 0 0 1D
templine=new char[INFTY+1]; MemTest(templine!=0);
comment=""; lcomment=0;
//&<<& f=fopen(cFName,"r"); if(f==0)return; delete cFName;
char *cFName=MFileName(BASE_CONFIG_FILE_NAME);
f=fopen(cFName,"r"); if(f==0)return; delete cFName;
//&>>&0 0 0 30
while(fgets(templine,INFTY,f)!=0){
//&<<& if(strcmp(templine,"&<<&*EXTENSIONS*\n")==0) {
if(strcmp(templine,"&<<&*EXTENSIONS*\n")==0) {
ExtensionsFold->Read(f,FILE_FOLD);
Init_ExtensionsFold2Mem(ExtensionsFold);
}
//&>>&1 0 1 0
//&<<& if(strcmp(templine,"&<<&*KEYMAP*\n")==0) {
if(strcmp(templine,"&<<&*KEYMAP*\n")==0) {
Init_keymapFold2Mem(f);
}
//&>>&1 0 1 2D
//&<<& if(strcmp(templine,"&<<&*SETUP*\n")==0) {
if(strcmp(templine,"&<<&*SETUP*\n")==0) {
Init_SetupFold2Mem(f);
}
//&>>&1 0 1 10
//&<<& if(strcmp(templine,"&<<&*COMMAND*\n")==0) {
if(strcmp(templine,"&<<&*COMMAND*\n")==0) {
Init_CommandFold2Mem(f);
}
//&>>&1 0 1 13
//&<<& if(strcmp(templine,"&<<&*MACRO*\n")==0) {
if(strcmp(templine,"&<<&*MACRO*\n")==0) {
Compile(f);
}
//&>>&1 0 1 17
}
fclose(f);
delete ExtensionsFold;
delete templine;
RuntimeStack->pos=NewLine(0);
}
//&>>&7 0 7 24
//&<<&EDITOR::~EDITOR();
EDITOR::~EDITOR(){
//&<<& #ifdef _ENABLE_LOGGING_
#ifdef _ENABLE_LOGGING_
DoLog("EDITOR::~EDITOR{\n");
#endif
//&>>&1 0 1 0
if(MinimalExitFromEditor) return;
SaveChDir(InitialDir);
//&<<& ConstantPage->Exit(); SearchFold->Exit();
if(CurrentPage!=ConstantPage)cur=ConstantPage->entry;
Fold *r=0; /// temporary variable
while((r=cur->Exit())!=0) cur=r;
while((r=SearchFold->Exit())!=0) SearchFold=r;
//&>>&4 0 4 B
comment=""; lcomment=0;
FILE *f=fopen(ConfigFileName,"w"); MemTest(f!=0);
SearchFold->Write(f,FILE_FOLD); //// Writing *SEARCH*
cur->Write(f,FILE_FOLD); //// Writing *TEMP*
fLineClipboard->Write(f,FILE_FOLD); //// Writing *LCB*
fclose(f);
//&<<& #ifdef _ENABLE_LOGGING_
#ifdef _ENABLE_LOGGING_
DoLog(" }\n");
#endif
//&>>&1 0 1 0
}
//&>>&B 0 B 11
//&>>&E 0 E 0
//&<<&void main()
void main(int argc,char *argv[]){
//&<<& #ifdef _ENABLE_LOGGING_
#ifdef _ENABLE_LOGGING_
DoLog("main(){\n");
#endif
//&>>&1 0 1 2B
#ifdef __X11__
mmm_screen.Init(argc,argv);
#endif
int i;
strcpy(RunDir,argv[0]);
SaveChDir(".");
iGCD_SavedDev=GetSavedDev();
Editor.InitEditorSetup();
Editor.ConfigFileName=MFileName("mmm.cfg");
Editor.InitUserSetup();
int fx=FILE_FOLD,fn=1;
int k=0;
FILE *pfScriptExists=fopen(MFileName("__mmm__.mmm"),"r");
if(pfScriptExists==0){
for(i=1;i<argc;i++) k|=_EDIT(argv[i],fn,fx,1);
if(k==0) _EDIT("",fn,fx,1);
}else{
fclose(pfScriptExists);
_EDIT_ScriptFile(MFileName("__mmm__.mmm")-1,fn,fx);
remove(MFileName("__mmm__.mmm"));
}
GetCurrentFileNameAndDepth();
//&<<& #ifdef _ENABLE_LOGGING_
#ifdef _ENABLE_LOGGING_
DoLog("}Process(){\n");
#endif
//&>>&1 0 1 0
Process();
}
//&>>&1E 0 1D 0
//// mmmx.err mmmx.err mmmx.err mmmx.err mmmx.err mmmx.err
//&>>&D 0 D 22