Team Ai
Datasetpublic

hschumann2/TempleOS-Source-Code

sourceHugging Faceupdated 1y agoView on Hugging Face
0likes847downloads
ACTask.txt285 linesDownload Raw Back to AutoComplete
1 2#help_index "AutoComplete/Dictionary"3U0 ACDDictWordsAdd(U8 *st)4{5  I64 i;6  U8 *ptr;7  if (st && *st && (ptr=ACDWordPtAt(st))) {8    for (i=0;i<ACD_FILLINS_NUM;i++) {9      if (*ptr++!=ACD_WORD_CHAR)10        break;11      if (i) '\n';12      acd.fillins[i]=ptr-1;13      "$GREEN$'%d'$FG$ %-23ts",i,ptr;14      ptr+=StrLen(ptr)+3;15    }16    acd.num_fillins=i;17  }18}19 20#help_index "AutoComplete"21U0 ACDocRst(I64 left,I64 top)22{23  CDoc *doc=DocPut;24  DocRst(doc,TRUE);25  doc->flags|=DOCF_SIZE_MIN;26  Fs->border_src=BDS_CONST;27  Fs->border_attr=LTGRAY<<4+DrvTextAttrGet(':')&15;28  Fs->text_attr  =LTGRAY<<4+BLUE;29  LBtr(&Fs->display_flags,DISPLAYf_SHOW);30  WinHorz(left,Fs->win_right);31  WinVert(top,Fs->win_bottom);32  DocCursor;33}34 35I64 ACSkipCrap(U8 *src,I64 len)36{37  I64 j;38  j=len-1;39  while (j>=0) {40    if (Bt(char_bmp_alpha_numeric,src[j]))41      break;42    else43      j--;44  }45  return j+1;46}47 48I64 ACPriorWordInStr(U8 *src,U8 *dst,I64 len,I64 buf_size)49{50  I64 i,j=0,k;51  i=len-1;52  while (i>=0)53    if (!Bt(char_bmp_alpha_numeric,src[i]))54      break;55    else56      i--;57  if (i>=-1 && len>0)58    for (k=i+1;k<len && j<buf_size-1;k++)59      dst[j++]=src[k];60  dst[j]=0;61  return i+1;62}63 64U0 ACFillInAdd(CHashAC *tmpw)65{66  I64 k;67  if (ac.num_fillins<AC_FILLINS_NUM ||68        tmpw->hits>ac.fillin_hits[ac.num_fillins-1]) {69    for (k=ac.num_fillins-1;k>=0;k--) {70      if (tmpw->hits<=ac.fillin_hits[k])71        break;72      else {73        ac.fillin_matches[k+1]=ac.fillin_matches[k];74        ac.fillin_hits[k+1]   =ac.fillin_hits[k];75      }76    }77    ac.fillin_matches[k+1]=tmpw;78    ac.fillin_hits[k+1]   =tmpw->hits;79    if (ac.num_fillins<AC_FILLINS_NUM)80      ac.num_fillins++;81  }82}83 84U0 ACPutChoices(CDoc *focus_l,CDocEntry *doc_e,CTask *focus_task,85        Bool force_refresh)86{87  I64 i,data_col;88  U8 *buf,*buf1,*src=NULL,*st;89  CHashAC *tmpw;90  F64 timeout_time=tS+0.5;91  CHashSrcSym *tmph;92 93  src=DocScanLine(focus_l,doc_e,&data_col);94  DocUnlock(focus_l);95  i=StrLen(src);96  buf =MAlloc(MaxI64(i+1,256));97  buf1=MAlloc(MaxI64(i+1,256));98  if (data_col==-1)99    data_col=0;100  data_col=ACPriorWordInStr(src,buf,data_col,256);101  ac.partial_len=StrLen(buf);102  data_col=ACSkipCrap(src,data_col);103  data_col=ACPriorWordInStr(src,buf1,data_col,256);104 105  if (!ac.cur_word || StrCmp(ac.cur_word,buf) || force_refresh) {106    st=ac.cur_word;107    ac.cur_word=AStrNew(buf);108    Free(st);109    ac.num_fillins=0;110    if (*ac.cur_word)111      for (i=0;i<=ac.hash_table->mask && tS<timeout_time;i++) {112        tmpw=ac.hash_table->body[i];113        while (tmpw) {114          if (!MemCmp(ac.cur_word,tmpw->str,StrLen(ac.cur_word)))115            ACFillInAdd(tmpw);116          tmpw=tmpw->next;117        }118      }119    ACDocRst(51,13);120    if (ac.cur_word && *ac.cur_word) {121      "$PURPLE$Word:%s$FG$\n",ac.cur_word;122      for (i=0;i<ac.num_fillins;i++) {123        st=ac.fillin_matches[i]->str;124        "$GREEN$F%02d$FG$ ",i+1;125        if (TaskValidate(focus_task) &&126              (tmph=HashFind(st,focus_task->hash_table,HTG_SRC_SYM)) &&127              tmph->src_link) {128          if (tmph->type&HTF_PUBLIC)129            "$RED$";130          "$TX+UL+L+PU,\"%$Q\",A=\"%s\"$$FG$\n",st,tmph->src_link;131        } else132          "%s\n",st;133      }134      if (acd.has_words)135        ACDDictWordsAdd(ac.cur_word);136    } else if (FileFind("::/Doc/StandBy.DD.Z"))137      Type("::/Doc/StandBy.DD.Z",0);138  }139  Free(src);140  Free(buf);141  Free(buf1);142}143 144U0 ACTaskNormal(I64 sc,I64 last_sc,145        CTask *focus_task,CTask *original_focus_task)146{147  CDoc *doc;148  CDocEntry *doc_e;149  if ((doc=DocPut(focus_task)) &&150        focus_task!=Fs && Bt(&focus_task->display_flags,DISPLAYf_SHOW)) {151    DocLock(doc);152    if (TaskValidate(focus_task) && original_focus_task==sys_focus_task &&153          doc && doc==DocPut(focus_task) && (doc_e=doc->cur_entry)) {154      if (doc_e==doc) doc_e=doc_e->last;155      while (doc_e->last!=doc && (doc_e->type_u8==DOCT_NEW_LINE ||156            doc_e->type_u8==DOCT_SOFT_NEW_LINE))157        doc_e=doc_e->last;158      while (doc_e->last->type_u8!=DOCT_NEW_LINE && doc_e->last!=doc)159        doc_e=doc_e->last;160      ACPutChoices(doc,doc_e,focus_task,ToBool(sc!=last_sc));161    } else162      DocUnlock(doc);163  }164  if (!LBts(&Fs->display_flags,DISPLAYf_SHOW))165    WinZBufUpdate;166}167 168U0 ACTaskCtrl(I64 sc,I64 last_sc,169        CTask *focus_task,CTask *original_focus_task)170{171  if (TaskValidate(focus_task) &&172        (focus_task->scroll_x || focus_task->scroll_y)) {173    if (LBtr(&Fs->display_flags,DISPLAYf_SHOW))174      WinZBufUpdate;175  } else {176    if (sc!=last_sc) {177      if (sc&SCF_ALT) {178        ACDocRst(27,3);179        if (TaskValidate(original_focus_task) &&180              !Bt(&original_focus_task->win_inhibit,WIf_SELF_KEY_DESC))181          KeyMapFamily(original_focus_task,0,182                ToBool(!(sc&SCF_SHIFT)),ToBool(sc&SCF_SHIFT));183        KeyMapCtrlAltFamily(184              ToBool(!(sc&SCF_SHIFT)),ToBool(sc&SCF_SHIFT));185      } else if (TaskValidate(original_focus_task) &&186            !Bt(&original_focus_task->win_inhibit,WIf_SELF_KEY_DESC)) {187        ACDocRst(27,3);188        KeyMapFamily(original_focus_task,SCF_CTRL,189              ToBool(!(sc&SCF_SHIFT)),ToBool(sc&SCF_SHIFT));190      }191    }192    if (!LBts(&Fs->display_flags,DISPLAYf_SHOW))193      WinZBufUpdate;194  }195}196 197U0 ACTaskAlt(I64 sc,I64 last_sc,198        CTask *,CTask *original_focus_task)199{200  if (sc!=last_sc && TaskValidate(original_focus_task) &&201        !Bt(&original_focus_task->win_inhibit,WIf_SELF_KEY_DESC)) {202    ACDocRst(27,3);203    KeyMapFamily(original_focus_task,SCF_ALT,204          ToBool(!(sc&SCF_SHIFT)),ToBool(sc&SCF_SHIFT));205  }206  if (!LBts(&Fs->display_flags,DISPLAYf_SHOW))207    WinZBufUpdate;208}209 210U0 ACTaskEndCB()211{212  ac.task=NULL;213  Exit;214}215 216U0 ACTask(I64)217{218  CTask *focus_task,*original_focus_task;219  I64 ch,scan_code=0,last_scan_code=0;220  CDoc *doc;221  Fs->task_end_cb=&ACTaskEndCB;222  DocTermNew;223  LBts(&Fs->display_flags,DISPLAYf_SHOW);224  WinHorz(51,Fs->win_right);225  LBts(&Fs->display_flags,DISPLAYf_WIN_ON_TOP);226  Fs->win_inhibit=WIG_NO_FOCUS_TASK_DFT;227  Free(ac.cur_word);228  ac.cur_word=NULL;229  while (TRUE) {230    if (scan_code&(SCF_CTRL|SCF_ALT) ||231          GetTSC>KbdMsEvtTime+cnts.time_stamp_freq>>1) {232      last_scan_code=scan_code;233      scan_code=kbd.scan_code;234    }235    original_focus_task=focus_task=sys_focus_task;236    while (TaskValidate(focus_task) &&237          Bt(&focus_task->task_flags,TASKf_INPUT_FILTER_TASK))238      focus_task=focus_task->parent_task;239    if (scan_code&SCF_CTRL)240      ACTaskCtrl(scan_code,last_scan_code,focus_task,original_focus_task);241     else if (TaskValidate(focus_task)) {242      if (scan_code&SCF_ALT)243        ACTaskAlt(scan_code,last_scan_code,focus_task,original_focus_task);244      else245        ACTaskNormal(scan_code,last_scan_code,focus_task,original_focus_task);246    }247    Sleep(333);248    if (ScanMsg(&ch,,1<<MSG_KEY_DOWN) && (ch==CH_ESC||ch==CH_SHIFT_ESC))249      break;250    doc=DocPut;251    DocLock(doc);252    if (doc->cur_entry->de_flags & DOCEF_LINK) {253      '' CH_SPACE;254      doc->cur_entry=doc;255    }256    DocUnlock(doc);257  }258}259 260public Bool AutoComplete(Bool val=OFF)261{//Turn AutoComplete OFF or ON.262  Bool  old_autocomplete=FALSE;263  while (Bt(&ac.flags,ACf_INIT_IN_PROGRESS))264    Sleep(10);265  if (val) {266    if (Bt(&sys_run_level,RLf_AUTO_COMPLETE)) {267      if (TaskValidate(ac.task))268        old_autocomplete=TRUE;269      else {270        ac.task=Spawn(&ACTask,NULL,"AutoComplete");271        TaskWait(ac.task);272      }273      WinToTop(ac.task);274    }275  } else {276    if (TaskValidate(ac.task)) {277      if (Bt(&sys_run_level,RLf_AUTO_COMPLETE))278        old_autocomplete=TRUE;279      Kill(ac.task);280      DeathWait(&ac.task);281    }282  }283  return old_autocomplete;284}285