Team Ai
Datasetpublic

hschumann2/TempleOS-Source-Code

sourceHugging Faceupdated 1y agoView on Hugging Face
0likes832downloads
DocForm.txt346 linesDownload Raw Back to DolDoc
1 2#help_index "DolDoc/Form"3 4U0 DocFormFwd(CDoc *doc,Bool giveup=FALSE)5{6  CDocEntry *doc_e=doc->cur_entry,*doc_e2=doc_e;7  if (doc->flags & DOCF_FORM) {8    if (doc_e==doc) goto ff_recover;9    while (!Bt(doldoc.type_flags_form,doc_e->type_u8) &&10          !(doc_e->de_flags&DOCEF_LINK) ||11          doc_e->de_flags&DOCEF_SKIP_IN_FORM) {12      doc_e=doc_e->next;13      if (doc_e==doc) {14ff_recover:15        doc->cur_col=0;16        if (!giveup) {17          doc->cur_entry=doc_e->last;18          DocFormBwd(doc,TRUE);19        } else20          doc->cur_entry=doc;21        return;22      }23    }24  }25  while (doc_e->type_u8==DOCT_INDENT)26    doc_e=doc_e->next;27  if (doc_e!=doc_e2) {28    doc->cur_col=doc_e->min_col;29    doc->cur_entry=doc_e;30  }31}32 33U0 DocFormBwd(CDoc *doc,Bool giveup=FALSE)34{35  CDocEntry *doc_e=doc->cur_entry,*doc_e2=doc_e;36  if (doc->flags & DOCF_FORM) {37    while (!Bt(doldoc.type_flags_form,doc_e->type_u8) &&38          !(doc_e->de_flags&DOCEF_LINK) ||39          doc_e->de_flags&DOCEF_SKIP_IN_FORM) {40      doc_e=doc_e->last;41      if (doc_e==doc) {42        doc->cur_col=0;43        if (!giveup) {44          doc->cur_entry=doc_e->next;45          DocFormFwd(doc,TRUE);46        } else47          doc->cur_entry=doc;48        return;49      }50    }51  }52  while (doc_e->type_u8==DOCT_INDENT)53    doc_e=doc_e->next;54  if (doc_e!=doc_e2) {55    doc->cur_col=doc_e->min_col;56    doc->cur_entry=doc_e;57  }58}59 60U0 DocDataFmt(CDoc *doc,CDocEntry *doc_e,I64 d=DOCM_CANCEL)61{62  I64 i;63  U8 *ptr,*ptr2;64  CHashDefineStr *tmph;65  if (doc_e->type_u8==DOCT_DATA && doc_e->de_flags&DOCEF_AUX_STR ||66        doc_e->type_u8==DOCT_CHECK_BOX || doc_e->de_flags & DOCEF_LST) {67    if (d==DOCM_CANCEL) {68      if (doc_e->de_flags&DOCEF_DEREF_DATA &&69            !(doc_e->de_flags&DOCEF_REMALLOC_DATA)) {70        if (!(ptr=doc_e->data)) return;71      } else72        ptr=&doc_e->data;73      switch (doc_e->raw_type) {74        case RT_I0:75        case RT_U0:     d=0;            break;76        case RT_I8:     d=*ptr(I8 *);   break;77        case RT_U8:     d=*ptr(U8 *);   break;78        case RT_I16:    d=*ptr(I16 *);  break;79        case RT_U16:    d=*ptr(U16 *);  break;80        case RT_I32:    d=*ptr(I32 *);  break;81        case RT_U32:    d=*ptr(U32 *);  break;82        default:        d=*ptr(I64 *);83      }84    }85    if (doc_e->type_u8==DOCT_DATA) {86      if (doc_e->de_flags & DOCEF_REMALLOC_DATA) {87        ptr=MStrPrint(doc_e->aux_str,d,doc_e->my_fmt_data);88        i=StrLen(ptr);89        if (!doc_e->data) {90          doc_e->data=CAlloc(2,doc->mem_task);91          doc_e->len=MSize(doc_e->data)-2;92        }93        if (doc_e->len+doc_e->min_col>i)94          MemCpy(doc_e->tag,ptr,i+1);95        else {96          ptr2=MAlloc(i+8,doc->mem_task);97          doc_e->len=MSize(ptr2)-doc_e->min_col-2;       //See DataTagWidth98          MemCpy(ptr2,ptr,i+1);99          Free(doc_e->tag);100          doc_e->tag=ptr2;101        }102        Free(ptr);103      } else {104        StrPrint(doc_e->tag,doc_e->aux_str,d,doc_e->my_fmt_data);105        i=StrLen(doc_e->tag);106      }107      if (doc_e->de_flags & DOCEF_HAS_TERMINATOR) {108        doc_e->tag[i++]='_';109        doc_e->tag[i]=0;110      }111      doc_e->max_col=i;112    } else if (doc_e->de_flags & DOCEF_LST) {113      if (doc_e->de_flags & DOCEF_DEFINE && (tmph=HashFind(doc_e->define_str,114            doc->win_task->hash_table,HTT_DEFINE_STR)) && 0<=d<tmph->cnt) {115        ptr=MStrPrint("[%s]",tmph->sub_idx[d]);116        Free(doc_e->tag);117        doc_e->tag=StrNew(ptr,doc->mem_task);118        Free(ptr);119      } else {120        Free(doc_e->tag);121        doc_e->tag=StrNew("[]",doc->mem_task);122      }123    } else {124      if (d)125        doc_e->de_flags|=DOCEF_CHECKED_COLLAPSED;126      else127        doc_e->de_flags&=~DOCEF_CHECKED_COLLAPSED;128    }129  }130}131 132U0 DocDataScan(CDoc *doc,CDocEntry *doc_e)133{134  I64 i,d;135  U8 *ptr,*ptr1,*ptr2;136  CHashDefineStr *tmph;137  if (doc_e->type_u8==DOCT_DATA && doc_e->de_flags&DOCEF_AUX_STR ||138        doc_e->type_u8==DOCT_CHECK_BOX || doc_e->de_flags & DOCEF_LST) {139    if (doc_e->de_flags&DOCEF_DEREF_DATA &&140          !(doc_e->de_flags&DOCEF_REMALLOC_DATA)) {141      if (!(ptr=doc_e->data)) return;142    } else143      ptr=&doc_e->data;144    if (doc_e->type_u8==DOCT_DATA) {145      i=StrLen(doc_e->tag);146      if (doc_e->de_flags & DOCEF_HAS_TERMINATOR)147        doc_e->tag[--i]=0;148      if (i>doc_e->len+doc_e->min_col)149        doc_e->tag[doc_e->len+doc_e->min_col]=0;150      if (RT_I8<=doc_e->raw_type<=RT_U32) {151        StrScan(doc_e->tag,doc_e->aux_str,&d,doc_e->my_fmt_data);152        if (doc_e->de_flags & DOCEF_HAS_TERMINATOR)153          doc_e->tag[i]='_';154      } else if (RT_I64<=doc_e->raw_type<=RT_UF64) {155        if (doc_e->de_flags & DOCEF_REMALLOC_DATA) {156          ptr=MAlloc(i-doc_e->min_col+8,doc->mem_task);157          MemCpy(ptr,doc_e->tag+doc_e->min_col,i-doc_e->min_col+1);158          Free(doc_e->data);159          doc_e->data=ptr;160          doc_e->len=MSize(ptr)-1;161        } else162          StrScan(doc_e->tag,doc_e->aux_str,ptr,doc_e->my_fmt_data);163        if (doc_e->de_flags & DOCEF_HAS_TERMINATOR)164          doc_e->tag[i]='_';165        return;166      }167    } else if (doc_e->de_flags & DOCEF_LST) {168      d=0;169      if (doc_e->tag && doc_e->de_flags & DOCEF_DEFINE &&170            (tmph=HashFind(doc_e->define_str,171            doc->win_task->hash_table,HTT_DEFINE_STR))) {172        ptr1=ptr2=StrNew(doc_e->tag);173        if (*ptr2=='[') {174          ptr2++;175          i=StrLen(ptr2);176          if (ptr2[i-1]==']')177            ptr2[i-1]=0;178        }179        d=LstMatch(ptr2,tmph->data);180        Free(ptr1);181      }182    } else {183      if (doc_e->de_flags & DOCEF_CHECKED_COLLAPSED)184        d=TRUE;185      else186        d=FALSE;187    }188    switch (doc_e->raw_type) {189      case RT_I8:190      case RT_U8:191        *ptr(U8 *)=d;192      case RT_I0:193      case RT_U0:194        break;195      case RT_I16:196      case RT_U16:197        *ptr(U16 *)=d;198        break;199      case RT_I32:200      case RT_U32:201        *ptr(U32 *)=d;202        break;203      default:204        *ptr(I64 *)=d;205    }206  }207}208 209#help_index "DolDoc/Input;StdIn/DolDoc"210public Bool DocForm(U8 *_d,U8 *class_name=lastclass,211    I64 dof_flags=0,U8 *header=NULL,U8 *footer=NULL)212{//User input. Supply a class name that has format definitions.213//See ::/Demo/DolDoc/Form.HC and ::/Demo/LastClass.HC.214  CMemberLst *ml;215  CDocEntry *doc_e;216  U8 *format;217  CHashClass *tmpc,*tmpc2;218  CDoc *doc;219  Bool res=FALSE;220  I64 old_border_src=Fs->border_src,has_action;221  if (!(tmpc=HashFind(class_name,Fs->hash_table,HTT_CLASS)))222    return FALSE;223  doc=DocNew;224  doc->desc='Form';225  if (header) DocPrint(doc,"%s",header);226  doc->flags|=DOCF_OVERSTRIKE|DOCF_FORM;227  if (dof_flags&DOF_SIZE_MIN)228    doc->flags|=DOCF_SIZE_MIN;229  ml=tmpc->member_lst_and_root;230  while (ml) {231    if ((format=MemberMetaData("format",ml)) &&232          (doc_e=DocPrint(doc,"%s",format))) {233      tmpc2=ml->member_class;234      if ((doc_e->type_u8==DOCT_DATA || doc_e->type_u8==DOCT_LST ||235            doc_e->type_u8==DOCT_CHECK_BOX) && !tmpc2->ptr_stars_cnt) {236        tmpc2=OptClassFwd(tmpc2);237        tmpc2-=tmpc2->ptr_stars_cnt;238        if (tmpc2->type & HTT_INTERNAL_TYPE) {239          if (ml->dim.next) { //Array240            if (tmpc2->raw_type==RT_U8 &&241                  LBtr(&doc_e->de_flags,&DOCEf_DFT_LEN)) {242              doc_e->len=ml->dim.total_cnt;243              if (doc_e->de_flags&DOCEF_HAS_TERMINATOR)244                doc_e->len--;245              Free(doc_e->tag);  //See DataTagWidth246              doc_e->tag=MAlloc(doc_e->len+doc_e->min_col+2,247                    doc->mem_task); //+2 because "_\0"248            }249          } else if (LBtr(&doc_e->de_flags,DOCEf_DFT_RAW_TYPE))250            doc_e->raw_type=tmpc2->raw_type;251        }252      }253      if (doc_e->de_flags&DOCEF_REMALLOC_DATA) {254        doc_e->user_data=_d+ml->offset;255        doc_e->data=*doc_e->user_data(U8 **);256      } else257        doc_e->data=_d+ml->offset;258      doc_e->my_fmt_data=MemberMetaData("data",ml);259      DocDataFmt(doc,doc_e);260    }261    ml=ml->next;262  }263  if (footer) DocPrint(doc,"%s",footer);264  if (doc->head.next!=doc)      {265    Fs->border_src=BDS_CONST;266    DocRecalc(doc);267    if (DocEd(doc,dof_flags)) {268      doc_e=doc->cur_entry;269      res=TRUE;270      if (doc_e!=doc) {271        if (DocEntryRun(doc,doc_e,TRUE,&has_action)==DOCM_CANCEL && has_action)272          res=FALSE;273        DocUnlock(doc);274      }275    }276  }277  doc_e=doc->head.next;278  while (doc_e!=doc) {279    if (doc_e->de_flags&DOCEF_REMALLOC_DATA) {280      *doc_e->user_data(U8 **)=doc_e->data;281      doc_e->data=NULL;282    }283    doc_e=doc_e->next;284  }285  DocDel(doc);286  Fs->border_src=old_border_src;287  return res;288}289 290U0 DocMenuEndTaskCB()291{292  WinToTop;293  throw;294}295 296public I64 DocMenu(CDoc *m,I64 dof_flags=0)297{//Run menu chooser doc. Returns menu doc unlocked.298  U8 *old_end_cb=Fs->task_end_cb;299  Bool old_break_shift_esc=LBts(&Fs->task_flags,TASKf_BREAK_TO_SHIFT_ESC);300  CDocEntry *doc_e;301  I64 old_border_src=Fs->border_src,res=DOCM_CANCEL,has_action;302  Fs->task_end_cb=&DocMenuEndTaskCB;303  try {304    if (m) {305      m->desc='Menu';306      Fs->border_src=BDS_CONST;307dm_restart:308      if (DocEd(m,dof_flags)) {309        doc_e=m->cur_entry;310        if (doc_e!=m) {311          res=DocEntryRun(m,doc_e,TRUE,&has_action);312          DocUnlock(m);313          if (!has_action) {314            res=DOCM_CANCEL;315            dof_flags|=DOF_DONT_HOME;316            goto dm_restart;317          }318        }319      }320    }321  } catch {322    if (!Fs->except_ch) {323      if (!(dof_flags & DOF_INTERCEPT_TASK_END))324        Exit;325      Fs->catch_except=TRUE;326    }327  }328  LBEqu(&Fs->task_flags,TASKf_BREAK_TO_SHIFT_ESC,old_break_shift_esc);329  Fs->border_src=old_border_src;330  Fs->task_end_cb=old_end_cb;331  return res;332}333 334public I64 PopUpMenu(CDoc *doc,I64 dof_flags=0)335{//Run menu chooser doc in PopUp win task.336  doc->flags|=DOCF_SIZE_MIN | DOCF_FORM;337  return PopUpPrint("DocMenu(0x%X,0x%X);",doc,dof_flags);338}339 340public Bool PopUpForm(U8 *_d,U8 *class_name=lastclass,341        I64 dof_flags=DOF_SIZE_MIN,U8 *header=NULL,U8 *footer=NULL)342{//See ::/Demo/DolDoc/Form.HC and ::/Demo/LastClass.HC.343  return PopUpPrint("DocForm(0x%X,0x%X,0x%X,0x%X,0x%X);",_d,class_name,344        dof_flags,header,footer);345}346