gtc/ti68k/ide/editor.h
2018-01-31 14:14:00 +00:00

228 lines
5.6 KiB
C

// Text Editor
#include "Workspace.h"
int onopen_gotoline=-1;
char *onopen_gotofile=NULL;
//void Edit(SYM_STR sym_text,char *text_name) {
void Edit(char *text_path) {
if (!(Port=malloc(LCD_SIZE)))
return;
PortSet(Port,239,127);
onopen_gotoline=-1;
editor_reopen:
if (onopen_gotofile!=NULL)
text_path = onopen_gotofile, onopen_gotofile = NULL;
char sym_buf[1+8+1+8+1];
*sym_buf = 0;
strncpy(sym_buf+1,text_path,sizeof(sym_buf)-1);
SYM_STR sym_text = sym_buf+1;
while (*sym_text) sym_text++;
char *text_name = strrchr(text_path,'\\');
if (!text_name)
text_name = text_path;
editor_reopen_samefile: {
int key,k,n,z=0;
void *ptr; int *kp;
unsigned int ST_f;
#ifdef HD2
#define hdx hd2
HANDLE hd2;
#else
#define hdx hd
#endif
int CU_state,KID,BKD,EDH_proc;
HSym hs; int arch=0;
if (!(hs=SymFind(sym_text)).folder)
goto editor_quit;
hdx=DerefSym(hs)->handle;
NLINES=(LCD_HEIGHT-10)/6;
YMAX=2+6*NLINES;
#ifdef TITLEBAR
NLINES--;
#endif
hs=SymFind(sym_text); // because malloc may cause garbage collection (shouldn't change HSym, but...)
if (DerefSym(hs)->flags.bits.archived)
arch=1
#ifndef HD2
, EM_moveSymFromExtMem(sym_text,HS_NULL), hdx=DerefSym(hs)->handle
#endif
;
#ifdef HD2
hsize=*(unsigned int *)HeapDeref(hdx);
hd=HeapAlloc(2+hsize);
if (!hd) return;
ptr=HLock(hd);
memcpy(ptr,HeapDeref(hdx),2+hsize);
#else
ptr=HLock(hd);
#endif
tptr=ptr+4;
spos=0; selpos=0; sel1=0; sel2=0;
curpos=cpos=((unsigned int *)ptr)[1];
if (onopen_gotoline>=0) {
cpos=1;
while (--onopen_gotoline)
while (tptr[cpos]) {
if (tptr[cpos]==NEWLINE) {
cpos+=2;
break;
}
cpos++;
}
//cpos=down(cpos,0);
curpos=cpos;
onopen_gotoline=-1;
}
/* tptr=" test-123123123123123123123123123123123123123\n \n \n OK :)"
"\n \n \n end\n \n \n of\n \n \n file"
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0";*/
/* tptr=" test-123123123123123123123123123123123123123\n \n \n \n \n OK :)"
"\n \n \n \n \n end\n \n \n \n \n of\n \n \n \n \n file\0\0\0\0\0\0\0";*/
size=strlen(tptr); hsize=*((unsigned int *)ptr);
if (!cpos || cpos>size)
cpos=1;
InitSearch();
// is_nl=1;
CU_state=CU_start();
scr_sptr=scr_stk;
#ifndef PEDROM
KID=OSInitKeyInitDelay(cKID);
BKD=OSInitBetweenKeyDelay(cBKD);
#endif
view_cursor();
msg="Welcome to GTC IDE !";
curword[0]=0;
pchnum=0;
last_act=0; ac_on=0; ac_disp=0;
add_all_pch();
//add_pch("std");
//add_pch("stdhead");
//add_pch("gen");
//add_pch("extgraph");
//add_pch("graphx");
//add_pch("keywords");
OSTimerRestart(APD_TIMER);
{
#if 0
char *p=(char *)sym_text;
while (*--p);
strcpy(curFileFullName,p+1);
#else
strcpy(curFileFullName,text_path);
#endif
}
strcpy(curFileName,text_name);
strcpy(curFileExt,GetFTString(hdx));
strtolower(curFileExt);
// WspNew();
// WspNew();
editor_exit_requested=0; // as the init in the loop is not sufficient...
do {
unsigned int par1s=par1;
memset(Port,0,LCD_SIZE);
par1=0; par2=0;
if (!sel1) {
unsigned int pos=cpos;
int deep=0;
while (pos>1 && tptr[pos-2]!=NEWLINE) {
pos--;
if (tptr[pos]==')') deep--;
if (tptr[pos]=='(' && (++deep)>0) { par1=pos; break; }
}
if (par1) {
while (tptr[pos] && tptr[pos]!=NEWLINE) {
pos++;
if (tptr[pos]=='(') deep++;
if (tptr[pos]==')' && (--deep)<=0) { par2=pos; break; }
}
if (!par2) par1=0;
}
}
if (chk_curword(curword,cpos,1) || (!curword[0] && par1!=par1s)) {
// char *tp;
nmatch=0;
if (curword[0] && (msg=pch_search(curword,strlen(curword)>=2,MAX_MATCH,match)))
msg=msg;
else if (chk_curword(parword,par1,0) && (msg=pch_search(parword,0,0,NULL))) msg=msg;
else msg=0;
if (msg) { msg=memcpy(msgBuf,msg,58); msg[58]=0; }
ac_disp=nmatch?last_act:0;
ac_on=0;
}
display(z);
if (ac_disp) ac_display(ac_on);
#ifndef RELEASE
if (xcur<0) msg="Cursor not encountered", xcur=1;
if (!curpos || tptr[curpos-1]==NEWLINE) msg="Invalid curpos";
#endif
DrawStatus();
LCD_restore(Port);
in_loop:
ST_f=ST_flagsL;
while (!(key=kbhit()) && !OSTimerExpired(CURSOR_TIMER)
&& !OSTimerExpired(APD_TIMER) && ST_f==ST_flagsL)
idle();
if (ST_f!=ST_flagsL) {
DrawStatus();
LCD_restore(Port);
goto in_loop;
} else if (OSTimerExpired(APD_TIMER)) {
Off();
OSTimerRestart(APD_TIMER);
continue;
}
OSTimerRestart(CURSOR_TIMER);
z=~z;
if (!key) continue;
OSTimerRestart(APD_TIMER);
last_act=0;
key=ngetchx();
editor_exit_requested=0;
KeyProcess(key,TM_MULTILINE);
z=0;
} while (key!=KEY_ESC && !editor_exit_requested);
close_pch();
#ifndef PEDROM
OSInitKeyInitDelay(KID);
OSInitBetweenKeyDelay(BKD);
#endif
if (!CU_state) CU_stop();
((unsigned int *)tptr)[-1]=cpos;
((unsigned int *)tptr)[-2]=size+2+1+1;
FreeMem();
#ifdef HD2
if (memcmp(tptr,2+2+HeapDeref(hdx),size+1+1)) {
SimpleDlg(NULL,"\n Saving file"DOTS" \n",B_CENTER,W_NOKEY);
LCD_restore(Port);
hs=SymFind(sym_text);
if (arch)
EM_moveSymFromExtMem(sym_text,HS_NULL), hdx=DerefSym(hs)->handle;
HeapFree(hdx);
HeapUnlock(hd);
HeapRealloc(hd,size+2+2+1+1);
hs=SymFind(sym_text);
DerefSym(hs)->handle=hd;
if (arch)
if (!EM_moveSymToExtMem(sym_text,HS_NULL))
ST_helpMsg("!!! MEMORY !!!"),ngetchx();
} else HeapUnlock(hd), HeapFree(hd);
#else
HeapUnlock(hd);
HeapRealloc(hd,size+2+2+1+1);
if (arch)
EM_moveSymToExtMem(sym_text,HS_NULL);
#endif
if (editor_exit_requested==EDEX_COMPILE) {
SimpleDlg(NULL,"\n Compiling project"DOTS" \n",B_CENTER,W_NOKEY);
LCD_restore(Port);
Compile(curFileFullName,PLUGIN_GTC);
goto editor_reopen;
}
}
editor_quit:
PortRestore();
free(Port);
}