659 lines
15 KiB
HolyC
659 lines
15 KiB
HolyC
|
#help_index "DolDoc/Misc"
|
|||
|
|
|||
|
U0 EdReplaceTroubleOne(CDoc *doc,U8 *st_original,U8 *st_safe,I64 num,
|
|||
|
Bool to_safe,Bool sel)
|
|||
|
{
|
|||
|
U8 buf[STR_LEN];
|
|||
|
StrPrint(buf,st_safe,num);
|
|||
|
if (to_safe)
|
|||
|
EdReplace(doc,st_original,buf,sel);
|
|||
|
else
|
|||
|
EdReplace(doc,buf,st_original,sel);
|
|||
|
}
|
|||
|
|
|||
|
U0 EdReplaceTroubleAll(CDoc *doc,Bool to_safe,Bool sel)
|
|||
|
{
|
|||
|
I64 i=0;
|
|||
|
EdReplaceTroubleOne(doc,"#assert" ,"//<@%d@>" ,i++,to_safe,sel);
|
|||
|
EdReplaceTroubleOne(doc,"#define" ,"//<@%d@>" ,i++,to_safe,sel);
|
|||
|
EdReplaceTroubleOne(doc,"#include","//<@%d@>" ,i++,to_safe,sel);
|
|||
|
//#if will match #if,#ifdef,#ifndef,#ifaot and #ifjit
|
|||
|
EdReplaceTroubleOne(doc,"#if" ,"//<@%d@>" ,i++,to_safe,sel);
|
|||
|
EdReplaceTroubleOne(doc,"#endif" ,"//<@%d@>" ,i++,to_safe,sel);
|
|||
|
//Convert #exe to union because we want that indent pattern.
|
|||
|
EdReplaceTroubleOne(doc,"#exe" ,"union@%d@",i++,to_safe,sel);
|
|||
|
EdReplaceTroubleOne(doc,"'{'" ,"'<@%d@>'" ,i++,to_safe,sel);
|
|||
|
EdReplaceTroubleOne(doc,"'}'" ,"'<@%d@>'" ,i++,to_safe,sel);
|
|||
|
}
|
|||
|
|
|||
|
#define C_INDENT_SPACES 2
|
|||
|
#define ASM_RENUM_SPACING 5
|
|||
|
|
|||
|
#define EF_REINDENT 0
|
|||
|
#define EF_CMP_CHK 1
|
|||
|
#define EF_RENUM_ASM 2
|
|||
|
#define EF_CTRL_SLIDER 3
|
|||
|
#define EF_CH_SC 4
|
|||
|
|
|||
|
I64 PopUpEdFmt()
|
|||
|
{
|
|||
|
I64 i;
|
|||
|
CDoc *doc=DocNew;
|
|||
|
DocPrint(doc,"$$LTBLUE$$$$MU,\"Compile Check\",LE=EF_CMP_CHK$$\n"
|
|||
|
"$$MU,\"Reindent HolyC Fun (Beware braces in strings.)\","
|
|||
|
"LE=EF_REINDENT$$\n"
|
|||
|
"$$MU,\"Renum Asm Local @@ Labels for Fun\",LE=EF_RENUM_ASM$$\n"
|
|||
|
"$$MU,\"Insert Template Code: Ctrl Slider\",LE=EF_CTRL_SLIDER$$\n"
|
|||
|
"$$MU,\"Insert ASCII/Scan Code Hex Codes for key pressed\","
|
|||
|
"LE=EF_CH_SC$$\n\n"
|
|||
|
"$$MU,\"CANCEL\",LE=DOCM_CANCEL$$\n\n"
|
|||
|
"$$GREEN$$<ALT-BACKSPACE>$$FG$$ to undo if not happy\n"
|
|||
|
"with the ress.\n");
|
|||
|
i=PopUpMenu(doc);
|
|||
|
DocDel(doc);
|
|||
|
return i;
|
|||
|
}
|
|||
|
|
|||
|
class CRILex
|
|||
|
{
|
|||
|
CCmpCtrl *cc1,*cc2;
|
|||
|
CQueVectU8 *indent;
|
|||
|
I64 depth,exp_depth,one_shot;
|
|||
|
Bool was_new_line,is_not_cont;
|
|||
|
};
|
|||
|
|
|||
|
I64 EdRILex(CRILex *rx)
|
|||
|
{
|
|||
|
rx->is_not_cont=FALSE;
|
|||
|
I64 i;
|
|||
|
CLexFile *tmpf;
|
|||
|
do {
|
|||
|
Lex(rx->cc1);
|
|||
|
Lex(rx->cc2);
|
|||
|
i=PrsKeyWord(rx->cc2);
|
|||
|
if (rx->cc1->token=='\n' && rx->cc2->token==';' || rx->cc2->token=='{' ||
|
|||
|
rx->cc2->token=='}' || rx->cc2->token==':' || rx->cc2->token==')' &&
|
|||
|
!rx->exp_depth || i==KW_ELSE || i==KW_CATCH || i==KW_DO)
|
|||
|
rx->is_not_cont=TRUE;
|
|||
|
if (rx->was_new_line && (rx->cc1->token!=':' || i==KW_CASE ||
|
|||
|
i==KW_DFT || i==KW_START || i==KW_END)) {
|
|||
|
tmpf=rx->cc2->lex_include_stk;
|
|||
|
while (tmpf->next)
|
|||
|
tmpf=tmpf->next;
|
|||
|
QueVectU8Put(rx->indent,tmpf->cur_entry->y,rx->depth+rx->one_shot);
|
|||
|
rx->one_shot=0;
|
|||
|
}
|
|||
|
if (rx->cc2->token=='\n')
|
|||
|
rx->was_new_line=TRUE;
|
|||
|
else
|
|||
|
rx->was_new_line=FALSE;
|
|||
|
} while (rx->cc1->token=='\n');
|
|||
|
return rx->cc1->token;
|
|||
|
}
|
|||
|
|
|||
|
U0 EdRIExp(CRILex *rx)
|
|||
|
{
|
|||
|
if (rx->cc1->token=='(') {
|
|||
|
if (!rx->exp_depth++)
|
|||
|
rx->depth+=3;
|
|||
|
EdRILex(rx);
|
|||
|
while (rx->cc1->token && rx->cc1->token!=')')
|
|||
|
EdRIExp(rx);
|
|||
|
if (!--rx->exp_depth) {
|
|||
|
rx->depth-=3;
|
|||
|
if (rx->depth<0) rx->depth=0;
|
|||
|
}
|
|||
|
} else if (rx->cc1->token=='[') {
|
|||
|
if (!rx->exp_depth++)
|
|||
|
rx->depth+=3;
|
|||
|
EdRILex(rx);
|
|||
|
while (rx->cc1->token && rx->cc1->token!=']')
|
|||
|
EdRIExp(rx);
|
|||
|
if (!--rx->exp_depth) {
|
|||
|
rx->depth-=3;
|
|||
|
if (rx->depth<0) rx->depth=0;
|
|||
|
}
|
|||
|
}
|
|||
|
EdRILex(rx);
|
|||
|
}
|
|||
|
|
|||
|
U0 EdRIStmt(CRILex *rx,Bool indent)
|
|||
|
{
|
|||
|
I64 i;
|
|||
|
Bool cont;
|
|||
|
if (rx->cc1->token=='{') {
|
|||
|
rx->depth++;
|
|||
|
EdRILex(rx);
|
|||
|
while (rx->cc1->token && rx->cc1->token!='}')
|
|||
|
EdRIStmt(rx,FALSE);
|
|||
|
if (--rx->depth<0) rx->depth=0;
|
|||
|
EdRILex(rx);
|
|||
|
} else {
|
|||
|
if (indent) rx->depth++;
|
|||
|
do {
|
|||
|
cont=FALSE;
|
|||
|
switch (PrsKeyWord(rx->cc1)) {
|
|||
|
case KW_IF:
|
|||
|
EdRILex(rx);
|
|||
|
EdRIExp(rx);
|
|||
|
EdRIStmt(rx,TRUE);
|
|||
|
if (PrsKeyWord(rx->cc1)==KW_ELSE) {
|
|||
|
EdRILex(rx);
|
|||
|
if (PrsKeyWord(rx->cc1)==KW_IF && rx->cc2->token!='\n')
|
|||
|
EdRIStmt(rx,FALSE);
|
|||
|
else
|
|||
|
EdRIStmt(rx,TRUE);
|
|||
|
}
|
|||
|
break;
|
|||
|
case KW_TRY:
|
|||
|
EdRILex(rx);
|
|||
|
EdRIStmt(rx,TRUE);
|
|||
|
if (PrsKeyWord(rx->cc1)==KW_CATCH) {
|
|||
|
EdRILex(rx);
|
|||
|
EdRIStmt(rx,TRUE);
|
|||
|
}
|
|||
|
break;
|
|||
|
case KW_LOCK:
|
|||
|
EdRILex(rx);
|
|||
|
EdRIStmt(rx,TRUE);
|
|||
|
break;
|
|||
|
case KW_FOR:
|
|||
|
case KW_WHILE:
|
|||
|
EdRILex(rx);
|
|||
|
EdRIExp(rx);
|
|||
|
EdRIStmt(rx,TRUE);
|
|||
|
break;
|
|||
|
case KW_ASM:
|
|||
|
case KW_CLASS:
|
|||
|
case KW_UNION:
|
|||
|
if (EdRILex(rx)==TK_IDENT)
|
|||
|
EdRILex(rx);
|
|||
|
EdRIStmt(rx,TRUE);
|
|||
|
break;
|
|||
|
case KW_DO:
|
|||
|
EdRILex(rx);
|
|||
|
EdRIStmt(rx,TRUE);
|
|||
|
if (PrsKeyWord(rx->cc1)==KW_WHILE) {
|
|||
|
EdRILex(rx);
|
|||
|
EdRIExp(rx);
|
|||
|
}
|
|||
|
if (rx->cc1->token==';')
|
|||
|
EdRILex(rx);
|
|||
|
break;
|
|||
|
case KW_SWITCH:
|
|||
|
EdRILex(rx);
|
|||
|
EdRIExp(rx);
|
|||
|
if (rx->cc1->token=='{') {
|
|||
|
rx->depth++;
|
|||
|
EdRILex(rx);
|
|||
|
i=0;
|
|||
|
while (rx->cc1->token && rx->cc1->token!='}') {
|
|||
|
switch (PrsKeyWord(rx->cc1)) {
|
|||
|
case KW_START:
|
|||
|
rx->depth+=i; i=0;
|
|||
|
while (EdRILex(rx) && rx->cc1->token!=':');
|
|||
|
EdRILex(rx);
|
|||
|
i++;
|
|||
|
break;
|
|||
|
case KW_END:
|
|||
|
rx->depth+=i; i=0;
|
|||
|
if (--rx->depth<0) rx->depth=0;
|
|||
|
while (EdRILex(rx) && rx->cc1->token!=':');
|
|||
|
EdRILex(rx);
|
|||
|
break;
|
|||
|
case KW_CASE:
|
|||
|
case KW_DFT:
|
|||
|
rx->depth+=i; i=0;
|
|||
|
while (EdRILex(rx) && rx->cc1->token!=':');
|
|||
|
EdRILex(rx);
|
|||
|
break;
|
|||
|
default:
|
|||
|
if (rx->cc1->token)
|
|||
|
EdRIStmt(rx,TRUE);
|
|||
|
}
|
|||
|
}
|
|||
|
if (--rx->depth<0) rx->depth=0;
|
|||
|
EdRILex(rx);
|
|||
|
}
|
|||
|
break;
|
|||
|
default:
|
|||
|
if (rx->cc1->token==TK_IDENT && rx->cc1->hash_entry &&
|
|||
|
rx->cc1->hash_entry->type&(HTT_OPCODE|HTT_ASM_KEYWORD)) {
|
|||
|
// rx->one_shot=4-rx->depth;
|
|||
|
do EdRILex(rx);
|
|||
|
while (rx->cc2->token && rx->cc2->token!='\n');
|
|||
|
rx->is_not_cont=TRUE;
|
|||
|
} else {
|
|||
|
while (rx->cc1->token && rx->cc1->token!=';' &&
|
|||
|
rx->cc1->token!=':') {
|
|||
|
if (rx->cc2->token=='\n' && !rx->is_not_cont)
|
|||
|
rx->one_shot=3;
|
|||
|
EdRILex(rx);
|
|||
|
}
|
|||
|
if (rx->cc1->token==':')
|
|||
|
cont=TRUE;
|
|||
|
EdRILex(rx);
|
|||
|
}
|
|||
|
}
|
|||
|
} while (cont && rx->cc1->token!='}');
|
|||
|
if (indent && --rx->depth<0)
|
|||
|
rx->depth=0;
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
CQueVectU8 *EdRICode(CDoc *doc)
|
|||
|
{
|
|||
|
CQueVectU8 *res;
|
|||
|
CRILex *rx=CAlloc(sizeof(CRILex));
|
|||
|
|
|||
|
rx->cc1=CmpCtrlNew(,CCF_KEEP_NEW_LINES|CCF_DONT_FREE_BUF,doc->filename.name);
|
|||
|
Free(rx->cc1->lex_include_stk->full_name);
|
|||
|
LexAttachDoc(rx->cc1,rx->cc1->lex_include_stk,doc,,
|
|||
|
doc->cur_entry,doc->cur_col);
|
|||
|
|
|||
|
rx->cc2=CmpCtrlNew(,CCF_KEEP_NEW_LINES|CCF_DONT_FREE_BUF,doc->filename.name);
|
|||
|
Free(rx->cc2->lex_include_stk->full_name);
|
|||
|
LexAttachDoc(rx->cc2,rx->cc2->lex_include_stk,doc,,
|
|||
|
doc->cur_entry,doc->cur_col);
|
|||
|
|
|||
|
rx->indent=QueVectU8New(doc->cur_entry->y);
|
|||
|
|
|||
|
Lex(rx->cc1);
|
|||
|
EdRIStmt(rx,FALSE);
|
|||
|
|
|||
|
CmpCtrlDel(rx->cc1);
|
|||
|
CmpCtrlDel(rx->cc2);
|
|||
|
res=rx->indent;
|
|||
|
Free(rx);
|
|||
|
return res;
|
|||
|
}
|
|||
|
|
|||
|
U0 EdRemFunLeadingSpace(CDoc *doc)
|
|||
|
{
|
|||
|
Bool unlock=DocLock(doc),
|
|||
|
start_of_line=TRUE;
|
|||
|
U8 *ptr;
|
|||
|
I64 ch,levels=1;
|
|||
|
CDocEntry *doc_e,*doc_e2;
|
|||
|
|
|||
|
EdGoToFun(doc,FALSE,FALSE);
|
|||
|
doc_e=doc->cur_entry->next;
|
|||
|
do {
|
|||
|
doc_e2=doc_e->next;
|
|||
|
if (doc_e!=doc && doc_e!=doc->cur_entry &&
|
|||
|
!(doc_e->de_flags&(DOCEG_DONT_EDIT-DOCEF_SCROLLING_X)))
|
|||
|
switch (doc_e->type_u8) {
|
|||
|
case DOCT_TEXT:
|
|||
|
ptr=doc_e->tag;
|
|||
|
if (start_of_line) {
|
|||
|
while (*ptr==CH_SPACE)
|
|||
|
ptr++;
|
|||
|
if (*ptr)
|
|||
|
start_of_line=FALSE;
|
|||
|
ptr=StrNew(ptr,doc->mem_task);
|
|||
|
Free(doc_e->tag);
|
|||
|
doc_e->tag=ptr;
|
|||
|
}
|
|||
|
if (!*ptr)
|
|||
|
DocEntryDel(doc,doc_e);
|
|||
|
else {
|
|||
|
while (ch=*ptr++)
|
|||
|
if (ch=='{')
|
|||
|
levels++;
|
|||
|
else if (ch=='}') {
|
|||
|
if (!--levels)
|
|||
|
break;
|
|||
|
}
|
|||
|
if (!levels) goto ls_done;
|
|||
|
}
|
|||
|
break;
|
|||
|
case DOCT_TAB:
|
|||
|
if (start_of_line)
|
|||
|
DocEntryDel(doc,doc_e);
|
|||
|
break;
|
|||
|
case DOCT_NEW_LINE:
|
|||
|
start_of_line=TRUE;
|
|||
|
break;
|
|||
|
default:
|
|||
|
start_of_line=FALSE;
|
|||
|
}
|
|||
|
doc_e=doc_e2;
|
|||
|
} while (doc_e!=doc->cur_entry);
|
|||
|
ls_done:
|
|||
|
DocRecalc(doc);
|
|||
|
DocCenter(doc);
|
|||
|
if (unlock)
|
|||
|
DocUnlock(doc);
|
|||
|
}
|
|||
|
|
|||
|
class CRenum
|
|||
|
{
|
|||
|
CRenum *next,*last;
|
|||
|
U8 label[sizeof(CEdFindText.find_text)];
|
|||
|
};
|
|||
|
|
|||
|
I64 EdRAGetU8(CDoc *doc)
|
|||
|
{
|
|||
|
I64 res=-1;
|
|||
|
while (doc->cur_entry!=doc &&
|
|||
|
doc->cur_entry->type&DOCET_SEL && res<0) {
|
|||
|
res=EdCurU8(doc);
|
|||
|
EdCursorRight(doc);
|
|||
|
}
|
|||
|
return res;
|
|||
|
}
|
|||
|
|
|||
|
U0 EdRACollect(CDoc *doc,CRenum *head)
|
|||
|
{
|
|||
|
I64 ch,i;
|
|||
|
CRenum *tmpr;
|
|||
|
U8 buf[sizeof(CEdFindText.find_text)];
|
|||
|
ch=EdRAGetU8(doc);
|
|||
|
while (ch>=0) {
|
|||
|
if (ch!='@')
|
|||
|
ch=EdRAGetU8(doc);
|
|||
|
else {
|
|||
|
ch=EdRAGetU8(doc);
|
|||
|
if (ch=='@') {
|
|||
|
ch=EdRAGetU8(doc);
|
|||
|
StrCpy(buf,"@@");
|
|||
|
i=2;
|
|||
|
while (ch>=0 && i<sizeof(CEdFindText.find_text)) {
|
|||
|
if (Bt(char_bmp_alpha_numeric,ch))
|
|||
|
buf[i++]=ch;
|
|||
|
else
|
|||
|
break;
|
|||
|
ch=EdRAGetU8(doc);
|
|||
|
}
|
|||
|
if (i<sizeof(CEdFindText.find_text)) {
|
|||
|
buf[i++]=0;
|
|||
|
while (ch>=0 && Bt(char_bmp_white_space,ch))
|
|||
|
ch=EdRAGetU8(doc);
|
|||
|
if (ch==':') {
|
|||
|
ch=EdRAGetU8(doc);
|
|||
|
tmpr=MAlloc(sizeof(CRenum));
|
|||
|
StrCpy(tmpr->label,buf);
|
|||
|
QueIns(tmpr,head->last);
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
//This is needed because we moved the
|
|||
|
//cursor and it didn't recalc.
|
|||
|
DocRecalc(doc);
|
|||
|
}
|
|||
|
|
|||
|
U0 EdRenumAsm(CDoc *doc)
|
|||
|
{
|
|||
|
Bool unlock=DocLock(doc);
|
|||
|
I64 num=0;
|
|||
|
CRenum head,*tmpr,*tmpr1;
|
|||
|
U8 buf[sizeof(CEdFindText.find_text)],
|
|||
|
buf2[sizeof(CEdFindText.find_text)];
|
|||
|
|
|||
|
QueInit(&head);
|
|||
|
EdSelFun(doc,TRUE);
|
|||
|
EdRACollect(doc,&head);
|
|||
|
|
|||
|
tmpr=head.next;
|
|||
|
while (tmpr!=&head) {
|
|||
|
tmpr1=tmpr->next;
|
|||
|
num+=ASM_RENUM_SPACING;
|
|||
|
StrPrint(buf,"@#%02d",num);
|
|||
|
EdReplace(doc,tmpr->label,buf,TRUE,TRUE,TRUE);
|
|||
|
Free(tmpr);
|
|||
|
tmpr=tmpr1;
|
|||
|
}
|
|||
|
|
|||
|
while (num) {
|
|||
|
StrPrint(buf, "@#%02d",num);
|
|||
|
StrPrint(buf2,"@@%02d",num);
|
|||
|
EdReplace(doc,buf,buf2,TRUE,TRUE,TRUE);
|
|||
|
num-=ASM_RENUM_SPACING;
|
|||
|
}
|
|||
|
EdSelAll(doc,FALSE);
|
|||
|
DocRecalc(doc);
|
|||
|
DocCenter(doc);
|
|||
|
if (unlock)
|
|||
|
DocUnlock(doc);
|
|||
|
}
|
|||
|
|
|||
|
U0 EdCodeTools2(CDoc *doc,I64 tool_action,Bool beep=TRUE)
|
|||
|
{
|
|||
|
Bool okay,unlock=DocLock(doc),start_of_line=TRUE;
|
|||
|
CDocEntry *doc_e,*doc_ne;
|
|||
|
I64 i,start_y,end_y,x,r,goto_line_num;
|
|||
|
U8 *b,*st,*st2,*prj_file;
|
|||
|
CTask *task=NULL;
|
|||
|
CJob *tmpc;
|
|||
|
CQueVectU8 *indent;
|
|||
|
|
|||
|
DocRecalc(doc);
|
|||
|
goto_line_num=doc->cur_entry->y+1;
|
|||
|
|
|||
|
DocCaptureUndo(doc,TRUE);
|
|||
|
switch (tool_action) {
|
|||
|
case EF_CMP_CHK:
|
|||
|
okay=FALSE;
|
|||
|
if (doc->flags&DOCF_PLAIN_TEXT)
|
|||
|
DocFlagsToggle(doc,DOCF_PLAIN_TEXT);
|
|||
|
DocWrite(doc);
|
|||
|
task=Spawn(&SrvCmdLine,NULL,"Srv",,Fs);
|
|||
|
st2=DirCur;
|
|||
|
st=MStrPrint("Cd(\"%s\");",st2);
|
|||
|
tmpc=TaskExe(task,Fs,st,1<<JOBf_WAKE_MASTER|1<<JOBf_FOCUS_MASTER);
|
|||
|
Free(st2);
|
|||
|
Free(st);
|
|||
|
WinHorz(Fs->win_left,Fs->win_right, task);
|
|||
|
WinVert(Fs->win_top, Fs->win_bottom,task);
|
|||
|
if (JobResScan(tmpc,&r)) {
|
|||
|
st=DirFile(doc->filename.name,,"PRJ.Z");
|
|||
|
prj_file=FileNameAbs(st,FUF_Z_OR_NOT_Z);
|
|||
|
Free(st);
|
|||
|
if (FileFind(prj_file)) {
|
|||
|
st2=DirFile(prj_file),
|
|||
|
st=MStrPrint("Cd(\"%s\");",st2);
|
|||
|
Free(st2);
|
|||
|
tmpc=TaskExe(task,Fs,st,1<<JOBf_WAKE_MASTER|
|
|||
|
1<<JOBf_FOCUS_MASTER|1<<JOBf_FREE_ON_COMPLETE);
|
|||
|
Free(st);
|
|||
|
st=MStrPrint("\"$$WW,1$$\";Cmp(\"%s\",\"SysTmp\",\"SysTmp\");",
|
|||
|
prj_file);
|
|||
|
tmpc=TaskExe(task,Fs,st,1<<JOBf_WAKE_MASTER|1<<JOBf_FOCUS_MASTER);
|
|||
|
Free(st);
|
|||
|
if (JobResScan(tmpc,&r))
|
|||
|
if (!r) {
|
|||
|
tmpc=TaskExe(task,Fs,
|
|||
|
"Load(\"SysTmp\",LDF_JUST_LOAD);",
|
|||
|
1<<JOBf_WAKE_MASTER|1<<JOBf_FOCUS_MASTER);
|
|||
|
if (JobResScan(tmpc,&r))
|
|||
|
okay=TRUE;
|
|||
|
}
|
|||
|
tmpc=TaskExe(task,Fs,"Del(\"SysTmp.*\");",
|
|||
|
1<<JOBf_WAKE_MASTER|1<<JOBf_FOCUS_MASTER);
|
|||
|
JobResScan(tmpc,&r);
|
|||
|
} else {
|
|||
|
Free(prj_file);
|
|||
|
st=DirFile(doc->filename.name,"Load","HC.Z");
|
|||
|
prj_file=FileNameAbs(st,FUF_Z_OR_NOT_Z);
|
|||
|
Free(st);
|
|||
|
if (FileFind(prj_file))
|
|||
|
st=MStrPrint("\"$$WW,1$$\";ExeFile(\"%s\",CCF_JUST_LOAD);",prj_file);
|
|||
|
else
|
|||
|
st=MStrPrint("\"$$WW,1$$\";ExeFile(\"%s\",CCF_JUST_LOAD);",
|
|||
|
doc->filename.name);
|
|||
|
tmpc=TaskExe(task,Fs,st,1<<JOBf_WAKE_MASTER|1<<JOBf_FOCUS_MASTER);
|
|||
|
Free(st);
|
|||
|
if (JobResScan(tmpc,&r) && r)
|
|||
|
okay=TRUE;
|
|||
|
}
|
|||
|
Free(prj_file);
|
|||
|
}
|
|||
|
if (!okay) {
|
|||
|
PopUpOk("Has Errors");
|
|||
|
while (LBts(&sys_semas[SEMA_FIX],0))
|
|||
|
Yield;
|
|||
|
ToFileLine(dbg.fix_file_line,&st,&i);
|
|||
|
LBtr(&sys_semas[SEMA_FIX],0);
|
|||
|
if (!StrCmp(st,doc->filename.name))
|
|||
|
goto_line_num=i;
|
|||
|
Free(st);
|
|||
|
}
|
|||
|
break;
|
|||
|
case EF_REINDENT:
|
|||
|
start_y=doc->cur_entry->y;
|
|||
|
EdReplaceTroubleAll(doc,TRUE,FALSE);
|
|||
|
DocGoToLine(doc,start_y+1);
|
|||
|
if (EdGoToFun(doc,FALSE,FALSE)) {
|
|||
|
start_y=doc->cur_entry->y;
|
|||
|
indent=EdRICode(doc);
|
|||
|
DocUnlock(doc);
|
|||
|
if (beep) {
|
|||
|
Snd(86); Sleep(150); Snd;
|
|||
|
Sleep(100);
|
|||
|
Snd(86); Sleep(150); Snd;
|
|||
|
}
|
|||
|
DocLock(doc);
|
|||
|
EdRemFunLeadingSpace(doc);
|
|||
|
DocGoToLine(doc,start_y+1);
|
|||
|
doc_e=doc->cur_entry;
|
|||
|
end_y=start_y+indent->total_cnt;
|
|||
|
while (start_y<=doc_e->y<end_y) {
|
|||
|
if (doc_e!=doc && doc_e!=doc->cur_entry &&
|
|||
|
!(doc_e->de_flags&(DOCEG_DONT_EDIT-DOCEF_SCROLLING_X))) {
|
|||
|
if (doc_e->type_u8==DOCT_NEW_LINE||
|
|||
|
doc_e->type_u8==DOCT_SOFT_NEW_LINE)
|
|||
|
start_of_line=TRUE;
|
|||
|
else {
|
|||
|
if (start_of_line) {
|
|||
|
i=QueVectU8Get(indent,doc_e->y)*C_INDENT_SPACES;
|
|||
|
x=doc_e->x+1;
|
|||
|
while (i>8) {
|
|||
|
doc_ne=DocEntryNewBase(doc,
|
|||
|
DOCT_TAB|doc->settings_head.dft_text_attr<<8,,
|
|||
|
x,doc_e->y,doc_e->page_line_num);
|
|||
|
MemCpy(&doc_ne->settings,
|
|||
|
&doc_e->settings,sizeof(CDocSettings));
|
|||
|
QueIns(doc_ne,doc_e->last);
|
|||
|
i-=8;
|
|||
|
x+=8;
|
|||
|
}
|
|||
|
if (i>0) {
|
|||
|
b=MAlloc(i+1,doc->mem_task);
|
|||
|
MemSet(b,CH_SPACE,i);
|
|||
|
b[i]=0;
|
|||
|
doc_ne=DocEntryNewBase(doc,
|
|||
|
DOCT_TEXT|doc->settings_head.dft_text_attr<<8,,
|
|||
|
x,doc_e->y,doc_e->page_line_num);
|
|||
|
doc_ne->tag=b;
|
|||
|
doc_ne->max_col=1;
|
|||
|
MemCpy(&doc_ne->settings,
|
|||
|
&doc_e->settings,sizeof(CDocSettings));
|
|||
|
QueIns(doc_ne,doc_e->last);
|
|||
|
}
|
|||
|
}
|
|||
|
start_of_line=FALSE;
|
|||
|
}
|
|||
|
}
|
|||
|
doc_e=doc_e->next;
|
|||
|
}
|
|||
|
QueVectU8Del(indent);
|
|||
|
}
|
|||
|
start_y=doc->cur_entry->y;
|
|||
|
EdReplaceTroubleAll(doc,FALSE,FALSE);
|
|||
|
DocGoToLine(doc,start_y+1);
|
|||
|
break;
|
|||
|
case EF_RENUM_ASM:
|
|||
|
if (EdGoToFun(doc,FALSE,TRUE)) {
|
|||
|
if (EdCurU8(doc)=='{') {
|
|||
|
EdCursorRight(doc);
|
|||
|
DocRecalc(doc);
|
|||
|
} else if (EdCurU8(doc)==':') {
|
|||
|
EdCursorRight(doc);
|
|||
|
if (EdCurU8(doc)==':')
|
|||
|
EdCursorRight(doc);
|
|||
|
DocRecalc(doc);
|
|||
|
}
|
|||
|
DocUnlock(doc);
|
|||
|
if (beep) {
|
|||
|
Snd(86); Sleep(150); Snd;
|
|||
|
Sleep(100);
|
|||
|
Snd(86); Sleep(150); Snd;
|
|||
|
}
|
|||
|
DocLock(doc);
|
|||
|
EdRenumAsm(doc);
|
|||
|
}
|
|||
|
break;
|
|||
|
}
|
|||
|
|
|||
|
DocRecalc(doc);
|
|||
|
DocGoToLine(doc,goto_line_num);
|
|||
|
|
|||
|
DocUnlock(doc);
|
|||
|
if (!unlock)
|
|||
|
DocLock(doc);
|
|||
|
if (task)
|
|||
|
Kill(task,FALSE);
|
|||
|
}
|
|||
|
|
|||
|
U0 EdPopUpChSC(I64 *_ch,I64 *_sc)
|
|||
|
{
|
|||
|
I64 sc;
|
|||
|
"Press A Key\n";
|
|||
|
DocPut->flags|=DOCF_SIZE_MIN;
|
|||
|
do GetMsg(_ch,&sc,1<<MSG_KEY_DOWN);
|
|||
|
while (sc.u8[0]==SC_SHIFT || sc.u8[0]==SC_CTRL || sc.u8[0]==SC_ALT);
|
|||
|
*_sc=sc;
|
|||
|
}
|
|||
|
|
|||
|
U0 EdChSC(CDoc *doc)
|
|||
|
{
|
|||
|
I64 ch,sc;
|
|||
|
U8 buf[STR_LEN];
|
|||
|
StrPrint(buf,"EdPopUpChSC(%d,%d);",&ch,&sc);
|
|||
|
PopUp(buf,Fs);
|
|||
|
if (ch==CH_BACKSPACE)
|
|||
|
DocPrint(doc,"CH_BACKSPACE,0x%X",sc);
|
|||
|
else if (ch=='\n')
|
|||
|
DocPrint(doc,"'\n',0x%X",sc);
|
|||
|
else if (CH_CTRLA<=ch<=CH_CTRLZ)
|
|||
|
DocPrint(doc,"CH_CTRL%C,0x%X",ch+'@',sc);
|
|||
|
else if (ch=='$$')
|
|||
|
DocPrint(doc,"'$$$$',0x%X",sc);
|
|||
|
else if (ch=='\\')
|
|||
|
DocPrint(doc,"'\\\\',0x%X",sc);
|
|||
|
else if (ch=='\'')
|
|||
|
DocPrint(doc,"'\\\'',0x%X",sc);
|
|||
|
else if (ch==CH_ESC)
|
|||
|
DocPrint(doc,"CH_ESC,0x%X",sc);
|
|||
|
else if (ch==CH_SHIFT_ESC)
|
|||
|
DocPrint(doc,"CH_SHIFT_ESC,0x%X",sc);
|
|||
|
else if (ch==CH_SPACE)
|
|||
|
DocPrint(doc,"CH_SPACE,0x%X",sc);
|
|||
|
else if (ch==CH_SHIFT_SPACE)
|
|||
|
DocPrint(doc,"CH_SHIFT_SPACE,0x%X",sc);
|
|||
|
else if (Bt(char_bmp_displayable,ch))
|
|||
|
DocPrint(doc,"'%c',0x%X",ch,sc);
|
|||
|
else
|
|||
|
DocPrint(doc,"0x%X,0x%X",ch,sc);
|
|||
|
}
|
|||
|
|
|||
|
U0 EdCodeTools(CDoc *doc)
|
|||
|
{
|
|||
|
I64 tool_action=PopUpEdFmt;
|
|||
|
switch (tool_action) {
|
|||
|
case EF_CMP_CHK:
|
|||
|
case EF_REINDENT:
|
|||
|
case EF_RENUM_ASM:
|
|||
|
EdCodeTools2(doc,tool_action);
|
|||
|
break;
|
|||
|
case EF_CTRL_SLIDER:
|
|||
|
TemplateCtrlSlider(doc);
|
|||
|
break;
|
|||
|
case EF_CH_SC:
|
|||
|
EdChSC(doc);
|
|||
|
break;
|
|||
|
}
|
|||
|
}
|