hschumann2/TempleOS-Source-Code
0838
1 2class CLine3{4 CLine *next,*last;5 U8 *line;6};7 8U0 EdLiteUpdate(CLine *head,CLine *cur_line,I64 cur_col,I64 line_start_col)9{10 I64 ch,i,j,k,k2,cursor_col,cursor_row=-1;11 U8 *st;12 CLine *tmpl=cur_line;13 Bool done_eof=FALSE;14 text.raw_col=0;15 for (i=0;i<text.rows/2;i++)16 if (tmpl->last!=head)17 tmpl=tmpl->last;18 for (i=0;i<text.rows;i++) {19 if (cursor_row<0 && tmpl==cur_line) {20 k=0;21 for (j=0;j<cur_col;j++)22 if (tmpl->line[j]=='\t')23 k=(k+8)&~7;24 else25 k++;26 cursor_col=k;27 cursor_row=i;28 }29 if (tmpl!=head) {30 st=tmpl->line;31 k=0;32 j=0;33 while (ch=*st++) {34 if (ch=='\t')35 k2=(k+8)&~7;36 else37 k2=k+1;38 if (line_start_col<=k<line_start_col+text.cols) {39 '' ch;40 j=k2-line_start_col;41 }42 k=k2;43 }44 if (j<text.cols)45 '\n';46 tmpl=tmpl->next;47 } else {48 if (!done_eof) {49 '<EOF>';50 done_eof=TRUE;51 }52 '\n';53 }54 }55 text.raw_col=text.cols*cursor_row+cursor_col-line_start_col;56 RawPutChar(0x7F);57}58 59Bool EdLite(U8 *filename,I64 num=1,I64 edf_dof_flags=0)60{//Light weight text editor for debugging.61 U8 *src,*src2,*src3,*dst,*buf,*bin_data=NULL;62 I64 i,cnt=0,ch,sc,size,bin_size=0,line_start_col=0,cur_col=0,63 old_raw_flags=text.raw_flags;64 CLine head,*tmpl,*tmpl1,*cur_line;65 Bool res=FALSE,66 old_raw=Raw(ON),67 old_debug=DbgMode(ON),68 old_single=SingleUser(ON);69 70 if (!filename) filename=blkdev.tmp_filename;71 buf=FileRead(filename,&size);72 73 PUSHFD74 CLI75 text.raw_flags=text.raw_flags&~RWF_SCROLL|RWF_SHOW_DOLLAR;76 kbd.scan_code=0;77 QueInit(&head);78 head.line=StrNew("");79 80 if (buf) {81 src=buf;82 while (*src) {83 src2=src;84 while ((ch=*src++) && ch!='\r' && ch!='\n');85 src--;86 *src++=0;87 if (!ch)88 src--;89 while (ch=='\r' && *src=='\n' || *src==CH_CURSOR)90 src++;91 dst=src3=src2;92 while (ch=*src3++)93 if (ch!='\n' && ch!=CH_CURSOR)94 *dst++=ch;95 *dst=0;96 97 tmpl=MAlloc(sizeof(CLine));98 tmpl->line=StrNew(src2);99 QueIns(tmpl,head.last);100 cnt++;101 }102 103 if (src+1-buf<size) {104 bin_data=MAlloc(bin_size=size-(src-buf));105 MemCpy(bin_data,src,bin_size);106 }107 Free(buf);108 res=TRUE;109 }110 111 cur_line=head.next;112 if (--num<0)113 res=FALSE;114 else {115 if (num<=cnt)116 while (num--)117 cur_line=cur_line->next;118 else {119 cur_line=&head;120 res=FALSE;121 }122 }123 do {124 if (cur_line==&head)125 cur_col=0;126 while (cur_col-line_start_col<0)127 line_start_col-=8;128 while (cur_col-line_start_col>=text.cols)129 line_start_col+=8;130 EdLiteUpdate(&head,cur_line,cur_col,line_start_col);131 switch (ch=GetKey(&sc,FALSE,TRUE)) {132 case 0:133 switch (sc.u8[0]) {134 case SC_CURSOR_UP:135 if (cur_line->last!=&head)136 cur_line=cur_line->last;137 if (cur_col>StrLen(cur_line->line))138 cur_col=StrLen(cur_line->line);139 break;140 case SC_CURSOR_DOWN:141 if (cur_line!=&head)142 cur_line=cur_line->next;143 if (cur_col>StrLen(cur_line->line))144 cur_col=StrLen(cur_line->line);145 break;146 case SC_CURSOR_RIGHT:147 cur_col++;148 if (cur_col>StrLen(cur_line->line)) {149 tmpl=cur_line->next;150 if (tmpl!=&head) {151 cur_col=0;152 cur_line=tmpl;153 } else154 cur_col=StrLen(cur_line->line);155 }156 break;157 case SC_CURSOR_LEFT:158 if (cur_col)159 cur_col--;160 else {161 tmpl=cur_line->last;162 if (tmpl!=&head) {163 cur_line=tmpl;164 cur_col=StrLen(tmpl->line);165 }166 }167 break;168 case SC_PAGE_UP:169 for (i=1;i<text.rows;i++) {170 if (cur_line->last!=&head)171 cur_line=cur_line->last;172 if (cur_col>StrLen(cur_line->line))173 cur_col=StrLen(cur_line->line);174 }175 break;176 case SC_PAGE_DOWN:177 for (i=1;i<text.rows;i++) {178 if (cur_line!=&head)179 cur_line=cur_line->next;180 if (cur_col>StrLen(cur_line->line))181 cur_col=StrLen(cur_line->line);182 }183 break;184 case SC_DELETE:185 if (cur_col==StrLen(cur_line->line)) {186 tmpl=cur_line->next;187 if (cur_line!=&head && tmpl!=&head) {188 src=MStrPrint("%s%s",cur_line->line,tmpl->line);189 Free(cur_line->line);190 Free(tmpl->line);191 cur_line->line=src;192 QueRem(tmpl);193 Free(tmpl);194 }195 } else196 StrCpy(cur_line->line+cur_col,cur_line->line+cur_col+1);197 break;198 }199 break;200 case '\n':201 case '\r':202 tmpl=MAlloc(sizeof(CLine));203 tmpl->line=StrNew(cur_line->line+cur_col);204 cur_line->line[cur_col]=0;205 QueIns(tmpl,cur_line);206 cur_line=tmpl;207 cur_col=0;208 break;209 case CH_BACKSPACE:210 if (cur_col) {211 StrCpy(cur_line->line+cur_col-1,cur_line->line+cur_col);212 cur_col--;213 } else if (cur_line!=&head && cur_line->last!=&head) {214 tmpl=cur_line->last;215 src=MStrPrint("%s%s",tmpl->line,cur_line->line);216 cur_col=StrLen(tmpl->line);217 Free(cur_line->line);218 Free(tmpl->line);219 tmpl->line=src;220 QueRem(cur_line);221 Free(cur_line);222 cur_line=tmpl;223 }224 break;225 case CH_CTRLY:226 if (cur_line!=&head) {227 tmpl=cur_line;228 cur_line=cur_line->next;229 QueRem(tmpl);230 Free(tmpl->line);231 Free(tmpl);232 cur_col=0;233 }234 break;235 default:236 if (Bt(char_bmp_printable,ch)) {237 if (cur_line==&head) {238 cur_line=MAlloc(sizeof(CLine));239 cur_line->line=StrNew("");240 QueIns(cur_line,head.last);241 }242 src=MAlloc(StrLen(cur_line->line)+2);243 MemCpy(src,cur_line->line,cur_col);244 src[cur_col]=ch;245 if (cur_col<StrLen(cur_line->line))246 StrCpy(src+cur_col+1,cur_line->line+cur_col);247 else248 src[cur_col+1]=0;249 Free(cur_line->line);250 cur_line->line=src;251 cur_col++;252 }253 }254 } while (ch!=CH_SHIFT_ESC && ch!=CH_ESC);255 256 if (ch!=CH_ESC) {257 if (edf_dof_flags&EDF_WAS_WRITE)258 res=FALSE;259 } else {260 size=bin_size;261 262 tmpl=head.next;263 while (tmpl!=&head) {264 size+=StrLen(tmpl->line)+1;265 tmpl=tmpl->next;266 }267 268 buf=dst=MAlloc(size);269 tmpl=head.next;270 while (tmpl!=&head) {271 i=StrLen(tmpl->line);272 MemCpy(dst,tmpl->line,i);273 dst+=i;274 *dst++='\n';275 tmpl=tmpl->next;276 }277 if (bin_data)278 MemCpy(dst,bin_data,bin_size);279 FileWrite(filename,buf,size);280 Free(buf);281 282 if (edf_dof_flags&EDF_WAS_WRITE)283 res=TRUE;284 }285 286 tmpl=head.next;287 while (tmpl!=&head) {288 tmpl1=tmpl->next;289 QueRem(tmpl);290 Free(tmpl->line);291 Free(tmpl);292 tmpl=tmpl1;293 }294 Free(head.line);295 Free(bin_data);296 Raw(old_raw);297 DbgMode(old_debug);298 SingleUser(old_single);299 text.raw_flags=text.raw_flags&~RWF_SHOW_DOLLAR|old_raw_flags&RWF_SHOW_DOLLAR;300 POPFD301 return res;302}303 304U0 ToFileLine(U8 *_fl_file_line,U8 **_filename,I64 *_linenum)305{//"FI:D:/Dir/File.HC,123" to "D:/Dir/File.HC" and 123.306 U8 *st,*fl_file_line=StrNew(_fl_file_line);307 I64 linenum;308 StrFirstRem(fl_file_line,":");309 st=StrNew(fl_file_line);310 StrLastRem(fl_file_line,",",st);311 linenum=Str2I64(st);312 Free(st);313 *_filename=fl_file_line;314 *_linenum=linenum;315}316 317Bool EdLiteFileLine(U8 *fl_file_line,I64 edf_dof_flags=0)318{319 Bool res;320 U8 *filename;321 I64 linenum;322 ToFileLine(fl_file_line,&filename,&linenum);323 res=EdLite(filename,linenum,edf_dof_flags);324 Free(filename);325 return res;326}327 328U0 FixSet(U8 *filename,I64 line)329{//Compiler calls this to set file line for Fix330 U8 *st=MStrPrint("FL:%s,%d",filename,line);331 while (LBts(&sys_semas[SEMA_FIX],0))332 Yield;333 Free(dbg.fix_file_line);334 dbg.fix_file_line=AStrNew(st);335 LBtr(&sys_semas[SEMA_FIX],0);336}337 338Bool Fix(I64 edf_dof_flags=0)339{//Jump to last err src code to fix it.340 U8 *st;341 Bool res=FALSE;342 343 while (LBts(&sys_semas[SEMA_FIX],0))344 Yield;345 st=StrNew(dbg.fix_file_line);346 LBtr(&sys_semas[SEMA_FIX],0);347 348 if (st) {349 if (IsRaw)350 res=EdLiteFileLine(st,edf_dof_flags);351 else352 res=Ed(st,edf_dof_flags);353 }354 Free(st);355 return res;356}357 