CoolFace
Datasetpublic

hschumann2/TempleOS-Source-Code

sourceHugging Faceupdated 1y agoView on Hugging Face
0likes838downloads
EdLite.txt357 linesDownload Raw Back to Kernel
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