24
24
25
25
#include <time_classes.h>
26
26
#include <eval_context.h>
27
+ #include <alloc.h> // xvasprintf
27
28
28
29
static void RemoveTimeClass (EvalContext * ctx , const char * tags )
29
30
{
@@ -44,17 +45,34 @@ static void RemoveTimeClass(EvalContext *ctx, const char* tags)
44
45
RlistDestroy (tags_rlist );
45
46
}
46
47
47
- StringSet * GetTimeClasses (time_t time ) {
48
+ static void InsertTimeClassF (StringMap * classes , const char * prefix , const char * type , const char * fmt , ...)
49
+ {
50
+ char * key ;
51
+ xasprintf (& key , "time_based_%s%s" , prefix , type );
52
+
53
+ va_list args ;
54
+ va_start (args , fmt );
55
+
56
+ char * value ;
57
+ NDEBUG_UNUSED int ret = xvasprintf (& value , fmt , args );
58
+ assert (ret >= 0 );
59
+
60
+ va_end (args );
61
+ StringMapInsert (classes , key , value );
62
+ }
63
+
64
+ StringMap * GetTimeClasses (time_t time ) {
48
65
// The first element is the local timezone
49
66
const char * tz_prefix [2 ] = { "" , "GMT_" };
67
+ const char * tz_var_prefix [2 ] = { "" , "gmt_" };
50
68
const char * tz_function [2 ] = { "localtime_r" , "gmtime_r" };
51
69
struct tm tz_parsed_time [2 ];
52
70
const struct tm * tz_tm [2 ] = {
53
71
localtime_r (& time , & (tz_parsed_time [0 ])),
54
72
gmtime_r (& time , & (tz_parsed_time [1 ]))
55
73
};
56
74
57
- StringSet * classes = StringSetNew ();
75
+ StringMap * classes = StringMapNew ();
58
76
59
77
for (int tz = 0 ; tz < 2 ; tz ++ )
60
78
{
@@ -67,16 +85,14 @@ StringSet *GetTimeClasses(time_t time) {
67
85
}
68
86
69
87
/* Lifecycle */
70
-
71
- StringSetAddF (classes , "%sLcycle_%d" , tz_prefix [tz ], ((tz_parsed_time [tz ].tm_year + 1900 ) % 3 ));
88
+ InsertTimeClassF (classes , tz_var_prefix [tz ], "lcycle" , "%sLcycle_%d" , tz_prefix [tz ], ((tz_parsed_time [tz ].tm_year + 1900 ) % 3 ));
72
89
73
90
/* Year */
74
-
75
- StringSetAddF (classes , "%sYr%04d" , tz_prefix [tz ], tz_parsed_time [tz ].tm_year + 1900 );
91
+ InsertTimeClassF (classes , tz_var_prefix [tz ], "yr" , "%sYr%04d" , tz_prefix [tz ], tz_parsed_time [tz ].tm_year + 1900 );
76
92
77
93
/* Month */
78
94
79
- StringSetAddF (classes , "%s%s" , tz_prefix [tz ], MONTH_TEXT [tz_parsed_time [tz ].tm_mon ]);
95
+ InsertTimeClassF (classes , tz_var_prefix [ tz ], "month" , "%s%s" , tz_prefix [tz ], MONTH_TEXT [tz_parsed_time [tz ].tm_mon ]);
80
96
81
97
/* Day of week */
82
98
@@ -85,55 +101,56 @@ StringSet *GetTimeClasses(time_t time) {
85
101
...
86
102
Sunday is 0 in tm_wday, 6 in DAY_TEXT */
87
103
day_text_index = (tz_parsed_time [tz ].tm_wday + 6 ) % 7 ;
88
- StringSetAddF (classes , "%s%s" , tz_prefix [tz ], DAY_TEXT [day_text_index ]);
104
+ InsertTimeClassF (classes , tz_var_prefix [ tz ], "dow" , "%s%s" , tz_prefix [tz ], DAY_TEXT [day_text_index ]);
89
105
90
106
/* Day */
91
107
92
- StringSetAddF (classes , "%sDay%d" , tz_prefix [tz ], tz_parsed_time [tz ].tm_mday );
108
+ InsertTimeClassF (classes , tz_var_prefix [ tz ], "dom" , "%sDay%d" , tz_prefix [tz ], tz_parsed_time [tz ].tm_mday );
93
109
94
110
/* Shift */
95
111
96
- StringSetAddF (classes , "%s%s" , tz_prefix [tz ], SHIFT_TEXT [tz_parsed_time [tz ].tm_hour / 6 ]);
112
+ InsertTimeClassF (classes , tz_var_prefix [ tz ], "pod" , "%s%s" , tz_prefix [tz ], SHIFT_TEXT [tz_parsed_time [tz ].tm_hour / 6 ]);
97
113
98
114
/* Hour */
99
115
100
- StringSetAddF (classes , "%sHr%02d" , tz_prefix [tz ], tz_parsed_time [tz ].tm_hour );
101
- StringSetAddF (classes , "%sHr%d" , tz_prefix [tz ], tz_parsed_time [tz ].tm_hour );
116
+ InsertTimeClassF (classes , tz_var_prefix [ tz ], "hr" , "%sHr%02d" , tz_prefix [tz ], tz_parsed_time [tz ].tm_hour );
117
+ InsertTimeClassF (classes , tz_var_prefix [ tz ], "hr_2" , "%sHr%d" , tz_prefix [tz ], tz_parsed_time [tz ].tm_hour );
102
118
103
119
/* Quarter */
104
120
105
121
quarter = tz_parsed_time [tz ].tm_min / 15 + 1 ;
106
122
107
- StringSetAddF (classes , "%sQ%d" , tz_prefix [tz ], quarter );
108
- StringSetAddF (classes , "%sHr%02d_Q%d" , tz_prefix [tz ], tz_parsed_time [tz ].tm_hour , quarter );
123
+ InsertTimeClassF (classes , tz_var_prefix [ tz ], "qoh" , "%sQ%d" , tz_prefix [tz ], quarter );
124
+ InsertTimeClassF (classes , tz_var_prefix [ tz ], "hr_qoh" , "%sHr%02d_Q%d" , tz_prefix [tz ], tz_parsed_time [tz ].tm_hour , quarter );
109
125
110
126
/* Minute */
111
127
112
- StringSetAddF (classes , "%sMin%02d" , tz_prefix [tz ], tz_parsed_time [tz ].tm_min );
128
+ InsertTimeClassF (classes , tz_var_prefix [ tz ], "min" , "%sMin%02d" , tz_prefix [tz ], tz_parsed_time [tz ].tm_min );
113
129
114
130
interval_start = (tz_parsed_time [tz ].tm_min / 5 ) * 5 ;
115
131
interval_end = (interval_start + 5 ) % 60 ;
116
132
117
- StringSetAddF (classes , "%sMin%02d_%02d" , tz_prefix [tz ], interval_start , interval_end );
133
+ InsertTimeClassF (classes , tz_var_prefix [ tz ], "min_span_5" , "%sMin%02d_%02d" , tz_prefix [tz ], interval_start , interval_end );
118
134
}
119
135
120
136
return classes ;
121
137
}
122
138
123
139
static void AddTimeClass (EvalContext * ctx , time_t time , const char * tags )
124
140
{
125
- StringSet * time_classes = GetTimeClasses (time );
141
+ StringMap * time_classes = GetTimeClasses (time );
126
142
if (time_classes == NULL ) {
127
143
return ;
128
144
}
129
145
130
- StringSetIterator iter = StringSetIteratorInit (time_classes );
131
- const char * time_class = NULL ;
132
- while ((time_class = StringSetIteratorNext (& iter )) != NULL ) {
133
- EvalContextClassPutHard (ctx , time_class , tags );
146
+ StringMapIterator iter = StringMapIteratorInit (time_classes );
147
+ MapKeyValue * item ;
148
+ while ((item = StringMapIteratorNext (& iter )) != NULL ) {
149
+ EvalContextClassPutHard (ctx , item -> value , tags );
150
+ EvalContextVariablePutSpecial (ctx , SPECIAL_SCOPE_SYS , item -> key , item -> value , CF_DATA_TYPE_STRING , "noreport" );
134
151
}
135
152
136
- StringSetDestroy (time_classes );
153
+ StringMapDestroy (time_classes );
137
154
}
138
155
139
156
void UpdateTimeClasses (EvalContext * ctx , time_t t )
0 commit comments