hschumann2/TempleOS-Source-Code
0847
1 2#help_index "Registry"3#define REGISTRY_FILENAME "~/Registry.HC.Z"4CDoc *sys_registry_doc=NULL;5I64 sys_msg_flags[1]={0};6F64 registry_version;7 8Bool RegCache()9{10 Bool old_silent;11 if (!sys_registry_doc) {12 old_silent=Silent;13 sys_registry_doc=DocRead(REGISTRY_FILENAME);14 Silent(old_silent);15 return FALSE;16 } else17 return TRUE;18}19 20public Bool RegDft(U8 *path,U8 *val,Bool is_adam_entry=FALSE)21{//Add code doc tree branch to registry.22 Bool res,unlock_doc;23 RegCache;24 unlock_doc=DocLock(sys_registry_doc);25 if (!DocTreeFind(sys_registry_doc,path)) {26 DocTreeMake(sys_registry_doc,path);27 DocPrint(sys_registry_doc,"%s",val);28 if (is_adam_entry) {29 if (Fs==adam_task)30 ExePrint("%s",val);31 else32 Adam("%s",val);33 }34 if (DrvIsWritable(*sys_registry_doc->filename.name))35 DocWrite(sys_registry_doc);36 res=FALSE;37 } else38 res=TRUE;39 if (unlock_doc)40 DocUnlock(sys_registry_doc);41 return res;42}43 44public I64 RegExe(U8 *path)45{//Execute doc tree branch in registry.46 RegCache;47 return DocTreeExe(sys_registry_doc,path);48}49 50public Bool RegWrite(U8 *path,U8 *fmt,...)51{//Rewrite doc tree branch in registry.52 Bool res;53 RegCache;54 res=DocTreeWriteJoin(sys_registry_doc,path,TRUE,fmt,argc,argv);55 return res;56}57 58public I64 RegCnt(U8 *path)59{//Tree branch cnt in registry.60 I64 res=0;61 CDocEntry *tree_branch,*start_indent,*end_indent;62 Bool unlock_doc=DocLock(sys_registry_doc);63 if (DocTreeFind(sys_registry_doc,path,64 &tree_branch,&start_indent,&end_indent)) {65 end_indent=end_indent->next;66 while (start_indent!=end_indent) {67 res++;68 start_indent=start_indent->next;69 }70 }71 if (unlock_doc)72 DocUnlock(sys_registry_doc);73 return res;74}75 76public Bool RegAppend(U8 *path,U8 *fmt,...)77{//Append to doc tree branch in registry.78 Bool res;79 RegCache;80 res=DocTreeAppendJoin(sys_registry_doc,path,TRUE,fmt,argc,argv);81 return res;82}83 84public Bool OneTimePopUp(U8 *_flags,I64 flag_num,U8 *msg)85{//See ::/Apps/X-Caliber/X-Caliber.HC.86 Bool res=FALSE;87 CDoc *doc=DocNew;88 CDocEntry *doc_e;89 if (!Bt(_flags,flag_num)) {90 if (msg) DocPrint(doc,"%s",msg);91 doc_e=DocPrint(doc,"\n$CB,\"Do not show this msg again.\",LE=1$");92 DocPrint(doc,"$CM+CX,0,4$$BT,\"OKAY\",LE=1$\n");93 if (PopUpMenu(doc)==1 && doc_e->de_flags&DOCEF_CHECKED_COLLAPSED) {94 LBts(_flags,flag_num);95 res=TRUE;96 }97 DocDel(doc);98 }99 return res;100}101 102U0 RegOneTimePopUp(I64 flag_num,U8 *msg)103{//You're not supposed to make system pop-up flags, only me.104 if (OneTimePopUp(sys_msg_flags,flag_num,msg))105 RegWrite("Adam/SysMsgFlags","sys_msg_flags[0]=0x%X;\n",106 sys_msg_flags[0]);107}108 109U0 RegInit()110{111 U8 buf[STR_LEN];112 Bool version_present;113 RegDft("Adam/SysMsgFlags","sys_msg_flags[0]=0;\n",TRUE);114 StrPrint(buf,"registry_version=%4.3f;\n",sys_os_version);115 version_present=RegDft("Adam/SysRegVer",buf,TRUE);116 RegExe("Adam");117 if (registry_version!=sys_os_version) {118 RegWrite("Adam/SysRegVer",buf);119 RegExe("Adam");120 }121}122 123#help_index "Boot/Once;Registry/Once"124#help_file "::/Doc/Once"125 126public U0 AOnceFlush()127{//Flush AOnce() buf.128 RegWrite("Once/Adam","");129}130 131public U0 OnceFlush()132{//Flush Once() buf.133 RegWrite("Once/User","");134}135 136public U0 AOnce(U8 *fmt,...)137{//Add Adam code to ~/Registry.HC, executed next boot.138 U8 *buf=StrPrintJoin(NULL,fmt,argc,argv);139 if (!Bt(&sys_run_level,RLf_ONCE_ADAM))140 AOnceFlush;141 RegAppend("Once/Adam","%s\n",buf);142 Free(buf);143}144 145public U0 Once(U8 *fmt,...)146{//Add User code to ~/Registry.HC, executed next boot.147 U8 *buf=StrPrintJoin(NULL,fmt,argc,argv);148 if (!Bt(&sys_run_level,RLf_ONCE_USER))149 OnceFlush;150 RegAppend("Once/User","%s\n",buf);151 Free(buf);152}153 154public U0 AOnceDrv(U8 drv_let=0,U8 *fmt,...)155{//Add Adam code to drv ~/Registry.HC, executed next boot.156 U8 *buf=StrPrintJoin(NULL,fmt,argc,argv);157 I64 old_drv_let=*sys_registry_doc->filename.name;158 if (drv_let)159 *sys_registry_doc->filename.name=drv_let;160 if (!Bt(&sys_run_level,RLf_ONCE_ADAM))161 AOnceFlush;162 RegAppend("Once/Adam","%s\n",buf);163 Free(buf);164 *sys_registry_doc->filename.name=old_drv_let;165}166 167public U0 OnceDrv(U8 drv_let=0,U8 *fmt,...)168{//Add User code to drv ~/Registry.HC, executed next boot.169 U8 *buf=StrPrintJoin(NULL,fmt,argc,argv);170 I64 old_drv_let=*sys_registry_doc->filename.name;171 if (drv_let)172 *sys_registry_doc->filename.name=drv_let;173 if (!Bt(&sys_run_level,RLf_ONCE_USER))174 OnceFlush;175 RegAppend("Once/User","%s\n",buf);176 Free(buf);177 *sys_registry_doc->filename.name=old_drv_let;178}179 180public U0 OnceExe()181{//Execute Once code. Call goes in ~/Once.HC.182 try {183 184 RegDft("Once/Adam","");185 if (RegCnt("Once/Adam")>2) {186 Adam("RegExe(\"Once/Adam\");");187 AOnceFlush;188 }189 LBts(&sys_run_level,RLf_ONCE_ADAM);190 191 RegDft("Once/User","");192 if (RegCnt("Once/User")>2) {193 RegExe("Once/User");194 OnceFlush;195 }196 LBts(&sys_run_level,RLf_ONCE_USER);197 198 } catch {199 AOnceFlush;200 LBts(&sys_run_level,RLf_ONCE_ADAM);201 OnceFlush;202 LBts(&sys_run_level,RLf_ONCE_USER);203 }204}205 