| | @@ -55,10 +55,32 @@ |
| 55 | 55 | va_start(ap, zFormat); |
| 56 | 56 | blob_vappendf(&g.thLog, zFormat, ap); |
| 57 | 57 | va_end(ap); |
| 58 | 58 | } |
| 59 | 59 | |
| 60 | +/* |
| 61 | +** Checks if the TH1 trace log needs to be enabled. If so, prepares |
| 62 | +** it for use. |
| 63 | +*/ |
| 64 | +void Th_InitTraceLog(){ |
| 65 | + g.thTrace = find_option("th-trace", 0, 0)!=0; |
| 66 | + if( g.thTrace ){ |
| 67 | + blob_zero(&g.thLog); |
| 68 | + } |
| 69 | +} |
| 70 | + |
| 71 | +/* |
| 72 | +** Prints the entire contents of the TH1 trace log to the standard |
| 73 | +** output channel. |
| 74 | +*/ |
| 75 | +void Th_PrintTraceLog(){ |
| 76 | + if( g.thTrace ){ |
| 77 | + fossil_print("\n------------------ BEGIN TRACE LOG ------------------\n"); |
| 78 | + fossil_print("%s", blob_str(&g.thLog)); |
| 79 | + fossil_print("\n------------------- END TRACE LOG -------------------\n"); |
| 80 | + } |
| 81 | +} |
| 60 | 82 | |
| 61 | 83 | /* |
| 62 | 84 | ** True if output is enabled. False if disabled. |
| 63 | 85 | */ |
| 64 | 86 | static int enableOutput = 1; |
| | @@ -692,10 +714,55 @@ |
| 692 | 714 | return TH_ERROR; |
| 693 | 715 | } |
| 694 | 716 | } |
| 695 | 717 | return res; |
| 696 | 718 | } |
| 719 | + |
| 720 | +/* |
| 721 | +** TH1 command: setting name |
| 722 | +** |
| 723 | +** Gets and returns the value of the specified Fossil setting. |
| 724 | +*/ |
| 725 | +#define SETTING_WRONGNUMARGS "setting ?-strict? ?--? name" |
| 726 | +static int settingCmd( |
| 727 | + Th_Interp *interp, |
| 728 | + void *p, |
| 729 | + int argc, |
| 730 | + const char **argv, |
| 731 | + int *argl |
| 732 | +){ |
| 733 | + int rc; |
| 734 | + int strict = 0; |
| 735 | + int nArg = 1; |
| 736 | + char *zValue; |
| 737 | + if( argc<2 || argc>4 ){ |
| 738 | + return Th_WrongNumArgs(interp, SETTING_WRONGNUMARGS); |
| 739 | + } |
| 740 | + if( fossil_strcmp(argv[nArg], "-strict")==0 ){ |
| 741 | + strict = 1; nArg++; |
| 742 | + } |
| 743 | + if( fossil_strcmp(argv[nArg], "--")==0 ) nArg++; |
| 744 | + if( nArg+1!=argc ){ |
| 745 | + return Th_WrongNumArgs(interp, SETTING_WRONGNUMARGS); |
| 746 | + } |
| 747 | + zValue = db_get(argv[nArg], 0); |
| 748 | + if( zValue!=0 ){ |
| 749 | + Th_SetResult(interp, zValue, -1); |
| 750 | + rc = TH_OK; |
| 751 | + }else if( strict ){ |
| 752 | + Th_ErrorMessage(interp, "no value for setting \"", argv[nArg], -1); |
| 753 | + rc = TH_ERROR; |
| 754 | + }else{ |
| 755 | + Th_SetResult(interp, 0, 0); |
| 756 | + rc = TH_OK; |
| 757 | + } |
| 758 | + if( g.thTrace ){ |
| 759 | + Th_Trace("[setting %s%#h] => %d<br />\n", strict ? "strict " : "", |
| 760 | + argl[nArg], argv[nArg], rc); |
| 761 | + } |
| 762 | + return rc; |
| 763 | +} |
| 697 | 764 | |
| 698 | 765 | /* |
| 699 | 766 | ** TH1 command: regexp ?-nocase? ?--? exp string |
| 700 | 767 | ** |
| 701 | 768 | ** Checks the string against the specified regular expression and returns |
| | @@ -765,10 +832,11 @@ |
| 765 | 832 | {"puts", putsCmd, (void*)&aFlags[1]}, |
| 766 | 833 | {"query", queryCmd, 0}, |
| 767 | 834 | {"randhex", randhexCmd, 0}, |
| 768 | 835 | {"regexp", regexpCmd, 0}, |
| 769 | 836 | {"repository", repositoryCmd, 0}, |
| 837 | + {"setting", settingCmd, 0}, |
| 770 | 838 | {"tclReady", tclReadyCmd, 0}, |
| 771 | 839 | {"stime", stimeCmd, 0}, |
| 772 | 840 | {"utime", utimeCmd, 0}, |
| 773 | 841 | {"wiki", wikiCmd, (void*)&aFlags[0]}, |
| 774 | 842 | {0, 0, 0} |
| | @@ -998,29 +1066,39 @@ |
| 998 | 1066 | /* |
| 999 | 1067 | ** COMMAND: test-th-render |
| 1000 | 1068 | */ |
| 1001 | 1069 | void test_th_render(void){ |
| 1002 | 1070 | Blob in; |
| 1071 | + Th_InitTraceLog(); |
| 1072 | + if( find_option("th-open-config", 0, 0)!=0 ){ |
| 1073 | + db_find_and_open_repository(OPEN_ANY_SCHEMA | OPEN_OK_NOT_FOUND, 0); |
| 1074 | + db_open_config(0); |
| 1075 | + } |
| 1003 | 1076 | if( g.argc<3 ){ |
| 1004 | 1077 | usage("FILE"); |
| 1005 | 1078 | } |
| 1006 | | - db_open_config(0); /* Needed for global "tcl" setting. */ |
| 1007 | 1079 | blob_zero(&in); |
| 1008 | 1080 | blob_read_from_file(&in, g.argv[2]); |
| 1009 | 1081 | Th_Render(blob_str(&in)); |
| 1082 | + Th_PrintTraceLog(); |
| 1010 | 1083 | } |
| 1011 | 1084 | |
| 1012 | 1085 | /* |
| 1013 | 1086 | ** COMMAND: test-th-eval |
| 1014 | 1087 | */ |
| 1015 | 1088 | void test_th_eval(void){ |
| 1016 | 1089 | int rc; |
| 1017 | 1090 | const char *zRc; |
| 1091 | + Th_InitTraceLog(); |
| 1092 | + if( find_option("th-open-config", 0, 0)!=0 ){ |
| 1093 | + db_find_and_open_repository(OPEN_ANY_SCHEMA | OPEN_OK_NOT_FOUND, 0); |
| 1094 | + db_open_config(0); |
| 1095 | + } |
| 1018 | 1096 | if( g.argc!=3 ){ |
| 1019 | 1097 | usage("script"); |
| 1020 | 1098 | } |
| 1021 | 1099 | Th_FossilInit(0, 0); |
| 1022 | 1100 | rc = Th_Eval(g.interp, 0, g.argv[2], -1); |
| 1023 | 1101 | zRc = Th_ReturnCodeName(rc, 1); |
| 1024 | | - fossil_print("%s%s%s\n", zRc, zRc ? ": " : "", |
| 1025 | | - Th_GetResult(g.interp, 0)); |
| 1102 | + fossil_print("%s%s%s\n", zRc, zRc ? ": " : "", Th_GetResult(g.interp, 0)); |
| 1103 | + Th_PrintTraceLog(); |
| 1026 | 1104 | } |
| 1027 | 1105 | |