Team Ai
Datasetpublic

hschumann2/TempleOS-Source-Code

sourceHugging Faceupdated 1y agoView on Hugging Face
0likes847downloads
DocChar.txt654 linesDownload Raw Back to DolDoc
1 2#help_index "DolDoc/Editor"3 4public I64 EdCurU8(CDoc *doc)5{//Return cur U8. See EdRenumAsm for an example.6  Bool unlock=DocLock(doc);7  CDocEntry *doc_ce=doc->cur_entry;8  I64 res=-1;9  if (doc_ce->type_u8==DOCT_TEXT &&10        doc_ce->min_col<=doc->cur_col<doc_ce->max_col)11    res=doc_ce->tag[doc->cur_col];12  else if (doc_ce->type_u8==DOCT_TAB)13    res='\t';14  else if (doc_ce->type_u8==DOCT_NEW_LINE ||15        doc_ce->type_u8==DOCT_SOFT_NEW_LINE)16    res='\n';17  if (unlock)18    DocUnlock(doc);19  return res;20}21 22public U0 EdCursorLeft(CDoc *doc,I64 sc=I64_MIN)23{//Move cursor left. Might need a call to DocRecalc().24//See EdRenumAsm for an example.25  U8 *dst;26  Bool unlock=DocLock(doc);27  CDocEntry *doc_ce=doc->cur_entry,*original_ce=doc_ce,*doc_ne;28  I64 cc=doc->cur_col,y=doc_ce->y;29  if (sc!=I64_MIN) sc=sc.u32[0];30  if (sc>=0 && sc&SCF_CTRL) {31    while (doc_ce->last!=doc && (doc_ce->last->y==y ||32          doc_ce->de_flags & (DOCEF_SKIP|DOCEF_FILTER_SKIP)))33      doc_ce=doc_ce->last;  //TODO: sel? recurse?34    cc=doc_ce->min_col;35  } else {36    if (cc>doc_ce->min_col) {37      if (IsEditableText(doc_ce) && cc<doc_ce->max_col) {38        dst=doc_ce->tag+cc;39        doc_ne=DocEntryNewTag(doc,doc_ce,dst);40        *dst=0;41        doc_ce->max_col=cc;42        QueIns(doc_ne,doc_ce);43      }44      cc--;45      if (IsEditableText(doc_ce) && cc>doc_ce->min_col) {46        dst=doc_ce->tag+cc;47        doc_ne=DocEntryNewTag(doc,doc_ce,dst);48        *dst=0;49        doc_ce->max_col=cc;50        QueIns(doc_ne,doc_ce);51        doc_ce=doc_ne;52        cc=doc_ce->min_col;53      }54      if (sc>=0)55        BEqu(&doc_ce->type,DOCEt_SEL,sc&SCF_SHIFT);56    } else {57      cc=doc_ce->min_col;58      while (doc_ce->last!=doc &&59            (doc_ce->last->type_u8==DOCT_SOFT_NEW_LINE ||60            doc_ce->last->type_u8==DOCT_INDENT ||61            doc_ce->last->de_flags&(DOCEF_SKIP|DOCEF_FILTER_SKIP))) {62        doc_ce=doc_ce->last;63        if (sc>=0)64          BEqu(&doc_ce->type,DOCEt_SEL,sc&SCF_SHIFT);65      }66      if (doc_ce->last!=doc) {67        doc_ce=doc_ce->last;68        if (doc_ce->max_col>doc_ce->min_col) {69          cc=doc_ce->max_col-1;70          if (IsEditableText(doc_ce) && cc>doc_ce->min_col) {71            dst=doc_ce->tag+cc;72            doc_ne=DocEntryNewTag(doc,doc_ce,dst);73            *dst=0;74            doc_ce->max_col=cc;75            QueIns(doc_ne,doc_ce);76            doc_ce=doc_ne;77            cc=doc_ce->min_col;78          }79        } else80          cc=doc_ce->max_col;81        if (sc>=0)82          BEqu(&doc_ce->type,DOCEt_SEL,sc&SCF_SHIFT);83      }84    }85  }86  doc->cur_col=cc;87  doc->cur_entry=doc_ce;88  if (doc_ce!=original_ce)89    DocFormBwd(doc);90  if (unlock)91    DocUnlock(doc);92}93 94public U0 EdCursorRight(CDoc *doc,I64 sc=I64_MIN)95{//Move cursor right. Might need a call to DocRecalc().96//See EdRenumAsm for an example.97  Bool unlock=DocLock(doc);98  U8 *dst;99  CDocEntry *doc_ce=doc->cur_entry,*original_ce=doc_ce,*doc_ne;100  I64 cc=doc->cur_col,y=doc_ce->y,old_de_flags,old_color;101  if (sc!=I64_MIN) sc=sc.u32[0];102  if (sc>=0 && sc&SCF_CTRL) {103    while (doc_ce!=doc && doc_ce->next->y==y &&104          doc_ce->next->type_u8!=DOCT_SOFT_NEW_LINE && doc_ce->next!=doc &&105          (doc_ce->next->type_u8!=DOCT_NEW_LINE || !(doc->flags & DOCF_FORM)) ||106          doc_ce->de_flags & (DOCEF_SKIP|DOCEF_FILTER_SKIP))107      doc_ce=doc_ce->next;108    if (doc_ce->max_col>doc_ce->min_col)109      cc=doc_ce->max_col-1;110    else111      cc=doc_ce->min_col;112  } else {113    if (cc<doc_ce->max_col) {114      if (IsEditableText(doc_ce) && cc>doc_ce->min_col) {115        dst=doc_ce->tag+cc;116        doc_ne=DocEntryNewTag(doc,doc_ce,dst);117        *dst=0;118        doc_ce->max_col=cc;119        QueIns(doc_ne,doc_ce);120        doc_ce=doc_ne;121        cc=doc_ce->min_col;122      }123      cc++;124      old_de_flags=doc_ce->de_flags;125      old_color=doc_ce->type;126      if (sc>=0)127        BEqu(&doc_ce->type,DOCEt_SEL,sc&SCF_SHIFT);128      if (IsEditableText(doc_ce) && cc<doc_ce->max_col) {129        dst=doc_ce->tag+cc;130        doc_ne=DocEntryNewTag(doc,doc_ce,dst);131        *dst=0;132        doc_ne->type=DOCT_TEXT | old_color & -0x100;133        doc_ne->de_flags=old_de_flags|doldoc.dft_de_flags[DOCT_TEXT];134        doc_ce->max_col=cc;135        QueIns(doc_ne,doc_ce);136        doc_ce=doc_ne;137        cc=doc_ce->min_col;138      } else if (cc>=doc_ce->max_col) {139        doc_ce=doc_ce->next;140        cc=doc_ce->min_col;141      }142    } else {143      if (doc_ce!=doc) {144        if (cc<=doc_ce->min_col && sc>=0)145          BEqu(&doc_ce->type,DOCEt_SEL,sc&SCF_SHIFT);146        doc_ce=doc_ce->next;147        while (doc_ce!=doc && doc_ce->de_flags&(DOCEF_SKIP|DOCEF_FILTER_SKIP)) {148          if (sc>=0)149            BEqu(&doc_ce->type,DOCEt_SEL,sc&SCF_SHIFT);150          doc_ce=doc_ce->next;151        }152        cc=doc_ce->min_col;153        if (doc_ce->type_u8==DOCT_SOFT_NEW_LINE) {154          if (sc>=0)155            BEqu(&doc_ce->type,DOCEt_SEL,sc&SCF_SHIFT);156          doc_ce=doc_ce->next;157          cc=doc_ce->min_col;158        }159      }160    }161  }162  doc->cur_col=cc;163  doc->cur_entry=doc_ce;164  if (doc_ce!=original_ce)165    DocFormFwd(doc);166  if (unlock)167    DocUnlock(doc);168}169 170public U0 EdLineUp(CDoc *doc,I64 sc=I64_MIN)171{//Move cursor up. Might need a call to DocRecalc().172//See EdRenumAsm for an example.173  Bool unlock=DocLock(doc);174  U8 *dst;175  I64 y,x;176  CDocEntry *doc_ce=doc->cur_entry,*doc_ne;177 178  if (sc!=I64_MIN) sc=sc.u32[0];179  if (doc_ce->type_u8==DOCT_HEX_ED) {180    doc->cur_col=doc->cur_col-doc_ce->hex_ed_width*3;181    if (doc->cur_col>=0) {182      if (unlock)183        DocUnlock(doc);184      return;185    } else186      doc->cur_col=0;187  }188  x=doc->x; y=doc->y;189  if (IsEditableText(doc_ce)) {190    if (doc_ce->min_col<doc->cur_col<doc_ce->max_col-1) {191      dst=doc_ce->tag+doc->cur_col;192      doc_ne=DocEntryNewTag(doc,doc_ce,dst);193      *dst=0;194      doc_ne->x=doc_ce->x+doc->cur_col;195      doc_ce->max_col=doc->cur_col;196      QueIns(doc_ne,doc_ce);197    } else if (doc->cur_col==doc_ce->min_col && doc_ce->last!=doc)198      doc_ce=doc_ce->last;199  } else if (doc_ce->last!=doc)200    doc_ce=doc_ce->last;201  if (sc>=0)202    BEqu(&doc_ce->type,DOCEt_SEL,sc&SCF_SHIFT);203  doc->cur_entry=doc_ce;204  DocFormBwd(doc);205  doc_ce=doc->cur_entry;206  while (doc_ce->last!=doc && (doc_ce->y>=y ||207        doc_ce->de_flags & (DOCEF_SKIP|DOCEF_FILTER_SKIP))) {208    doc_ce=doc_ce->last;209    if (sc>=0)210      BEqu(&doc_ce->type,DOCEt_SEL,sc&SCF_SHIFT);211  }212  y=doc_ce->y;213  doc->y=y;214  while (doc_ce!=doc && (doc_ce->y>=y && doc_ce->x>=x ||215        doc_ce->de_flags & (DOCEF_SKIP|DOCEF_FILTER_SKIP))) {216    if (sc>=0)217      BEqu(&doc_ce->type,DOCEt_SEL,sc&SCF_SHIFT);218    doc_ce=doc_ce->last;219  }220 221  if (doc_ce==doc || doc_ce->y<y)222    doc_ce=doc_ce->next;223  else {224    if (!IsEditableText(doc_ce)) {225      if (sc>=0)226        BEqu(&doc_ce->type,DOCEt_SEL,sc&SCF_SHIFT);227    } else {228      if (doc_ce->next->x==x) {229        doc_ce=doc_ce->next;230        if (doc->flags & DOCF_FORM)231          while (doc_ce->next->x==x &&232                (!Bt(doldoc.type_flags_form,doc_ce->type_u8) &&233                !(doc_ce->de_flags&DOCEF_LINK)||234                doc_ce->de_flags&DOCEF_SKIP_IN_FORM))235            doc_ce=doc_ce->next;236      }237    }238  }239  if (doc_ce->de_flags&DOCEF_TAG) {240    doc->cur_col=x-doc_ce->x;241    if (IsEditableText(doc_ce)) {242      if (doc->cur_col>doc_ce->max_col)243        doc->cur_col=doc_ce->max_col;244    } else if (doc->cur_col>=doc_ce->max_col)245      doc->cur_col=doc_ce->max_col-1;246    if (doc->cur_col<doc_ce->min_col)247      doc->cur_col=doc_ce->min_col;248  } else {249    if (doc_ce->type_u8==DOCT_HEX_ED) {250      doc->cur_col=RoundI64((doc_ce->len-1)*3,doc_ce->hex_ed_width*3);251      if (doc->cur_col<0)252        doc->cur_col=0;253    } else254      doc->cur_col=doc_ce->min_col;255  }256  if (IsEditableText(doc_ce) && doc_ce->x<x) {257    if (doc->cur_col<doc_ce->max_col-1) {258      dst=doc_ce->tag+doc->cur_col;259      doc_ne=DocEntryNewTag(doc,doc_ce,dst);260      *dst=0;261      if (sc>=0) {262        if (sc&SCF_SHIFT)263          doc_ne->type=doc_ce->type | DOCET_SEL;264        else265          doc_ne->type=doc_ce->type & ~DOCET_SEL;266      }267      doc_ne->x=doc_ce->x+doc->cur_col;268      doc_ce->max_col=doc->cur_col;269      QueIns(doc_ne,doc_ce);270      doc_ce=doc_ne;271      doc->cur_col=doc_ce->min_col;272    }273  }274  doc->cur_entry=doc_ce;275  DocFormFwd(doc);276  doc->x=doc->cur_entry->x+doc->cur_col;277  if (unlock)278    DocUnlock(doc);279}280 281public U0 EdLineDown(CDoc *doc,I64 sc=I64_MIN)282{//Move cursor down. Might need a call to DocRecalc().283//See EdRenumAsm for an example.284  Bool unlock=DocLock(doc);285  U8 *dst;286  I64 y,x,old_de_flags=0,old_color;287  CDocEntry *doc_ce=doc->cur_entry,*doc_ne,*doc_ce2;288  if (sc!=I64_MIN) sc=sc.u32[0];289  if (doc_ce->type_u8==DOCT_HEX_ED) {290    doc->cur_col=doc->cur_col+doc_ce->hex_ed_width*3;291    if (doc->cur_col>=doc_ce->len*3) {292      doc->cur_entry=doc_ce=doc_ce->next;293      doc->cur_col=doc_ce->min_col;294      doc->x=doc_ce->x+doc->cur_col;295      doc->y=doc_ce->y;296    }297    if (unlock)298      DocUnlock(doc);299    return;300  }301  x=doc->x; y=doc->y;302  if (IsEditableText(doc_ce)) {303    if (doc->cur_col>doc_ce->min_col && doc->cur_col<doc_ce->max_col-1) {304      dst=doc_ce->tag+doc->cur_col;305      doc_ne=DocEntryNewTag(doc,doc_ce,dst);306      *dst=0;307      if (sc>=0) {308        if (sc&SCF_SHIFT)309          doc_ne->type=doc_ce->type | DOCET_SEL;310        else311          doc_ne->type=doc_ce->type & ~DOCET_SEL;312      }313      doc_ne->x=doc_ce->x+doc->cur_col;314      doc_ce->max_col=doc->cur_col;315      QueIns(doc_ne,doc_ce);316      doc_ce=doc_ne;317      doc->cur_col=doc_ce->min_col;318    }319  }320  doc_ce2=doc_ce;321  while (doc_ce!=doc && (doc_ce->y<=y ||322        doc_ce->de_flags & (DOCEF_SKIP|DOCEF_FILTER_SKIP)))323    doc_ce=doc_ce->next;324  y=doc_ce->y;325  doc->y=y;326  while (doc_ce!=doc && (doc_ce->y<=y && doc_ce->x<=x ||327        doc_ce->de_flags & (DOCEF_SKIP|DOCEF_FILTER_SKIP))) {328    old_de_flags=doc_ce->de_flags;329    old_color=doc_ce->type;330    doc_ce=doc_ce->next;331  }332  if (doc_ce->last!=doc && (doc_ce->x>x && doc_ce->last->y>=y || doc_ce->y>y)) {333    doc_ce=doc_ce->last;334    doc->cur_entry=doc_ce;335    if (!((doc_ce->type_u8==DOCT_NEW_LINE ||336          doc_ce->type_u8==DOCT_SOFT_NEW_LINE ||337          doc_ce->type_u8==DOCT_INDENT) &&338          (doc_ce->last->type_u8==DOCT_NEW_LINE ||339          doc_ce->last->type_u8==DOCT_SOFT_NEW_LINE ||340          doc_ce->last->type_u8==DOCT_INDENT)))341      DocFormBwd(doc);342    doc_ce=doc->cur_entry;343  }344  while (doc_ce2!=doc && (doc_ce2!=doc_ce || IsEditableText(doc_ce))) {345    if ((doc_ce2->y<y || doc_ce2->x<x ||346          doc_ce2->de_flags & (DOCEF_SKIP|DOCEF_FILTER_SKIP) ||347          doc_ce2->x==x && !doc_ce2->max_col &&348          Bt(doldoc.type_flags_nontag_invis,doc_ce2->type_u8)) && sc>=0)349      BEqu(&doc_ce2->type,DOCEt_SEL,sc&SCF_SHIFT);350    if (doc_ce2==doc_ce) break;351    doc_ce2=doc_ce2->next;352  }353  if (doc_ce->de_flags&DOCEF_TAG) {354    doc->cur_col=x-doc_ce->x;355    if (IsEditableText(doc_ce)) {356      if (doc->cur_col>doc_ce->max_col)357        doc->cur_col=doc_ce->max_col;358    } else if (doc->cur_col>=doc_ce->max_col)359      doc->cur_col=doc_ce->max_col-1;360    if (doc->cur_col<doc_ce->min_col)361      doc->cur_col=doc_ce->min_col;362  } else363    doc->cur_col=doc_ce->min_col;364  if (IsEditableText(doc_ce)&&doc_ce->min_col<doc->cur_col<doc_ce->max_col-1) {365    dst=doc_ce->tag+doc->cur_col;366    doc_ne=DocEntryNewTag(doc,doc_ce,dst);367    *dst=0;368    doc_ne->type=DOCT_TEXT | old_color & -0x100;369    doc_ne->de_flags=old_de_flags|doldoc.dft_de_flags[DOCT_TEXT];370    doc_ce->max_col=doc->cur_col;371    doc_ne->x=doc_ce->x+doc->cur_col;372    QueIns(doc_ne,doc_ce);373    doc_ce=doc_ne;374    doc->cur_col=doc_ce->min_col;375  }376  doc->cur_entry=doc_ce;377  DocFormFwd(doc);378  if (!(doc->flags & DOCF_FORM))379    while (doc_ce!=doc && doc_ce!=doc->cur_entry) {380      if (sc>=0)381        BEqu(&doc_ce->type,DOCEt_SEL,sc&SCF_SHIFT);382      doc_ce=doc_ce->next;383    }384  doc->x=doc->cur_entry->x+doc->cur_col;385  if (unlock)386    DocUnlock(doc);387}388 389U0 EdCharDel(CDoc *doc)390{391  Bool unlock=DocLock(doc);392  CDocEntry *doc_ce=doc->cur_entry;393 394  if (doc_ce==doc) {395    if (unlock)396      DocUnlock(doc);397    return;398  }399  if (doc_ce->max_col!=0 &&400        (IsEditableText(doc_ce)||doc_ce->type_u8==DOCT_DATA)) {401    if (doc_ce->type_u8==DOCT_DATA && doc_ce->de_flags & DOCEF_HAS_TERMINATOR &&402          doc->cur_col==doc_ce->max_col-1) {403      if (unlock)404        DocUnlock(doc);405      return;406    }407    if (doc->cur_col<doc_ce->max_col)408      StrCpy(doc_ce->tag+doc->cur_col,doc_ce->tag+doc->cur_col+1);409    if (doc->cur_col>=doc_ce->max_col-1) {410      doc->cur_entry=doc_ce->next;411      doc->cur_col=doc->cur_entry->min_col;412    }413    DocRemSoftNewLines(doc,doc->cur_entry);414    if (unlock)415      DocUnlock(doc);416    return;417  }418  doc->cur_entry=doc_ce->next;419  doc->cur_col=doc->cur_entry->min_col;420  if (!(doc_ce->de_flags&DOCEF_FILTER_SKIP))421    DocEntryDel(doc,doc_ce);422  DocRemSoftNewLines(doc,doc->cur_entry);423  if (unlock)424    DocUnlock(doc);425}426 427U0 ChkDollarBufSize(CDoc *doc)428{429  U8 *b;430  if (doc->dollar_buf_ptr>=doc->dollar_buf_size-2) {431    doc->dollar_buf_size<<=1;432    b=MAlloc(doc->dollar_buf_size,doc->mem_task);433    MemCpy(b,doc->dollar_buf,doc->dollar_buf_ptr);434    Free(doc->dollar_buf);435    doc->dollar_buf=b;436  }437}438 439U0 EdCharIns(I64 ch,I64 sc,CDoc *doc)440{441  Bool unlock=DocLock(doc);442  U8 *st,*src,*dst;443  CDocEntry *doc_ce=doc->cur_entry,*doc_ne;444  I64 i,j,m,y=doc_ce->y;445 446  if (doc->flags & DOCF_IN_DOLLAR) {447    if (!Bt(char_bmp_printable,ch))448      goto ic_done;449    ChkDollarBufSize(doc);450    doc->dollar_buf[doc->dollar_buf_ptr++]=ch;451    if (ch=='$') {452      if (doc->dollar_buf_ptr==2) {453        doc->flags&=~DOCF_IN_DOLLAR;454        doc->dollar_buf_ptr=0;455        goto ic_cont;456      } else {457        doc->dollar_buf[doc->dollar_buf_ptr]=0;458        doc->flags&=~DOCF_IN_DOLLAR;459        DocPrint(doc,"%s",doc->dollar_buf);460        doc->dollar_buf_ptr=0;461        goto ic_done;462      }463    } else464      goto ic_done;465  }466  if (ch=='$' && !(doc->flags & (DOCF_PLAIN_TEXT|DOCF_PLAIN_TEXT_TABS))) {467    doc->flags|=DOCF_IN_DOLLAR;468    doc->dollar_buf_ptr=0;469    doc->dollar_buf[doc->dollar_buf_ptr++]=ch;470    goto ic_done;471  }472  if (ch=='\r') goto ic_done;473 474    ic_cont:475  if ((ch==CH_SPACE || ch=='\n') &&476        !(sc & (SCF_CTRL|SCF_SHIFT)) &&477        doc_ce->de_flags &478        (DOCEF_LINK|DOCEF_TREE|DOCEF_LST|DOCEF_CHECK_COLLAPSABLE|479        DOCEF_LEFT_MACRO|DOCEF_LEFT_EXP|DOCEF_LEFT_CB|DOCEF_LEFT_IN_STR |480        DOCEF_RIGHT_MACRO|DOCEF_RIGHT_EXP|DOCEF_RIGHT_CB|DOCEF_RIGHT_IN_STR)) {481    doc->cmd_U8=ch;482    DocEntryRun(doc,doc_ce,FALSE);483    DocLock(doc);484    goto ic_done;485  }486  if (doc_ce->type_u8==DOCT_HEX_ED) {487    if (doc_ce->de_flags&DOCEF_DEREF_DATA &&488          !(doc_ce->de_flags&DOCEF_REMALLOC_DATA))489      st=doc_ce->data;490    else491      st=&doc_ce->data;492    i=doc->cur_col;493    j=i%(doc_ce->hex_ed_width*3);494    m=i/(doc_ce->hex_ed_width*3)*doc_ce->hex_ed_width;495    if (j>=doc_ce->hex_ed_width<<1)496      st[j-doc_ce->hex_ed_width<<1+m]=ch;497    else {498      ch=ToUpper(ch)-'0';499      if (ch>9) {500        ch+='0'-'A'+10;501        if (!(10<=ch<=15))502          goto ic_done;503      }504      m=j>>1+m;505      if (j & 1)506        st[m]=st[m] & 0xF0| ch;507      else508        st[m]=st[m] & 0xF | ch<<4;509    }510    doc->cur_col++;511    goto ic_done;512  }513  if (doc->flags & DOCF_OVERSTRIKE) {514    if (Bt(char_bmp_displayable,ch)) {515ic_overstrike:516      if (IsEditableText(doc_ce)) {517        if (doc->cur_col<doc_ce->max_col) {518          if (doc_ce->tag[doc->cur_col]) {519            doc_ce->tag[doc->cur_col++]=ch;520            goto ic_done;521          }522        } else {523          doc_ce=doc_ce->next;524          doc->cur_entry=doc_ce;525          doc->cur_col=doc_ce->min_col;526          goto ic_overstrike;527        }528      } else if (doc_ce->type_u8==DOCT_DATA) {529        if (doc_ce->de_flags & DOCEF_HAS_TERMINATOR) {530          if (doc_ce->tag[doc->cur_col] &&531                doc->cur_col<doc_ce->min_col+doc_ce->len) {532            doc_ce->tag[doc->cur_col++]=ch;533            if ( ! doc_ce->tag[doc->cur_col]) {534              doc_ce->tag[doc->cur_col]='_';535              doc_ce->tag[doc->cur_col+1]=0;536            }537          } else if (doc_ce->de_flags & DOCEF_REMALLOC_DATA)538            goto ic_not_overstrike;539        } else if (doc_ce->tag[doc->cur_col])540          doc_ce->tag[doc->cur_col++]=ch;541        goto ic_done;542      }543      doc_ne=DocEntryNewTag(doc,doc_ce,&ch);544      doc_ne->type=DOCT_TEXT | doc->settings_head.dft_text_attr<<8;545      doc_ne->de_flags=doldoc.dft_de_flags[DOCT_TEXT];546      QueIns(doc_ne,doc_ce->last);547    } else if (ch=='\n') {548      while (doc->cur_entry->next!=doc && doc->cur_entry->y==y)549        doc->cur_entry=doc->cur_entry->next;550      doc->cur_col=doc->cur_entry->min_col;551    } else if (ch=='\t') {552      if (doc->flags&DOCF_FORM)553        goto ic_form_tab;554    }555    goto ic_done;556  }557ic_not_overstrike:558  if (ch=='\n') {559    if (sc&SCF_CTRL && !(sc&SCF_SHIFT)) {560      doc_ne=DocEntryNewBase(doc,561            DOCT_PAGE_BREAK|doc->settings_head.dft_text_attr<<8);562    } else {563      doc_ne=DocEntryNewBase(doc,564            DOCT_NEW_LINE|doc->settings_head.dft_text_attr<<8);565    }566    DocInsEntry(doc,doc_ne);567  } else if (ch=='\t') {568    if (doc->flags&DOCF_FORM &&569          (Bt(doldoc.type_flags_form,doc->cur_entry->type_u8) ||570          doc->cur_entry->de_flags&DOCEF_LINK) &&571          !(doc->cur_entry->de_flags&DOCEF_SKIP_IN_FORM)) {572ic_form_tab:573      doc->cur_entry=doc->cur_entry->next;574      doc->cur_col=doc->cur_entry->min_col;575      DocFormFwd(doc);576      goto ic_done;577    } else {578      doc_ne=DocEntryNewBase(doc,DOCT_TAB|doc->settings_head.dft_text_attr<<8);579      DocInsEntry(doc,doc_ne);580    }581  } else {582    if (Bt(char_bmp_displayable,ch)) {583      if (doc_ce->type_u8==DOCT_DATA) {584        while (TRUE) {585          i=doc_ce->len+doc_ce->min_col;586          if (doc_ce->de_flags & DOCEF_HAS_TERMINATOR)587            i++;588          if (doc_ce->max_col<i) {589            st=doc_ce->tag;590            doc_ce->max_col++;591            for (i=doc_ce->max_col;i>doc->cur_col;i--)592              st[i]=st[i-1];593            st[doc->cur_col++]=ch;594            break;595          } else if (doc_ce->de_flags & DOCEF_REMALLOC_DATA) {596            st=MAlloc(doc_ce->max_col+8,doc->mem_task);597            MemCpy(st,doc_ce->tag,doc_ce->max_col+1);598            Free(doc_ce->tag);599            doc_ce->tag=st;600            doc_ce->len=MSize(st)-doc_ce->min_col-2; //See DataTagWidth601            Free(doc_ce->data);602            doc_ce->data=MAlloc(doc_ce->len+2,doc->mem_task);603          } else604            break;605        }606      } else if (IsEditableText(doc_ce)) {607        dst=st=MAlloc(doc_ce->max_col+2,doc->mem_task);608        src=doc_ce->tag;609        i=doc->cur_col;610        while (i-->0)611          *dst++=*src++;612        *dst++=ch;613        while (*dst++=*src++);614        Free(doc_ce->tag);615        doc_ce->tag=st;616        doc_ce->max_col++;617        doc->cur_col++;618      } else {619        doc_ne=DocEntryNewTag(doc,doc_ce,&ch);620        doc_ne->type=DOCT_TEXT | doc->settings_head.dft_text_attr<<8;621        doc_ne->de_flags=doldoc.dft_de_flags[DOCT_TEXT];622        doc_ne->x=doc_ce->x+1;623        QueIns(doc_ne,doc_ce->last);624      }625    }626  }627ic_done:628  DocRemSoftNewLines(doc,doc->cur_entry);629  if (doc->cur_entry->de_flags & DOCEF_UPDATE_DATA &&630        (doc->cur_entry->type_u8==DOCT_DATA ||631        doc->cur_entry->type_u8==DOCT_CHECK_BOX))632    DocDataScan(doc,doc->cur_entry);633  if (unlock)634    DocUnlock(doc);635}636 637U0 EdLineDel(CDoc *doc)638{639  CDocEntry *doc_ce=doc->cur_entry,*doc_ce2;640  I64 y;641  y=doc->y;642  while (doc_ce!=doc && doc_ce->y==y)643    doc_ce=doc_ce->next;644  doc->cur_entry=doc_ce;645  doc->cur_col=doc_ce->min_col;646  doc_ce=doc_ce->last;647  while (doc_ce!=doc && doc_ce->y==y) {648    doc_ce2=doc_ce->last;649    if (!(doc_ce->de_flags&DOCEF_FILTER_SKIP))650      DocEntryDel(doc,doc_ce);651    doc_ce=doc_ce2;652  }653}654