123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227 |
- // 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);
- }
|