1 #include "WWWLib.h"
2 #include "CSLUtils.h"
3 #include "CSLL.h"
4 #include "CSLLSt.h"
5
6 /* base of all streams */
7 struct _HTStream {
8 const HTStreamClass * isa;
9 /* ... */
10 };
11
ps(HTStream * pStream,const char * fmt,...)12 PUBLIC BOOL ps(HTStream * pStream, const char * fmt, ...)
13 {
14 va_list list;
15 char space[257];
16
17 va_start(list, fmt);
18 vsprintf(space, fmt, list);
19 va_end(list);
20 return ((*pStream->isa->put_string)(pStream, space));
21 }
22
23 struct State_Parms_s {
24 CSLabel_t * pCSLabel;
25 HTStream * pStream;
26 };
27
28 #define OUTPUT_OPTION_TOKEN_BVAL(str, local) \
29 if (BVal_initialized(local))\
30 ps(pStream, str" %s ", BVal_value(local) ? "YES" : "NO");
31 #define OUTPUT_OPTION_TOKEN_FVAL(str, local) \
32 if (FVal_initialized(local))\
33 ps(pStream, str" %.1f ", FVal_value(local));
34 #define OUTPUT_OPTION_TOKEN_SVAL(str, local) \
35 if (SVal_initialized(local))\
36 ps(pStream, str" \"%s\" ", SVal_value(local));
37 #define OUTPUT_OPTION_TOKEN_DVAL(str, local) \
38 if (DVal_initialized(local))\
39 ps(pStream, str" \"%s\" ", DVal_value(local));
LabelOptions_output(LabelOptions_t * me,HTStream * pStream)40 PRIVATE int LabelOptions_output(LabelOptions_t * me, HTStream * pStream)
41 {
42 HTList * comments;
43 char * comment;
44 OUTPUT_OPTION_TOKEN_DVAL("at", &me->at)
45 OUTPUT_OPTION_TOKEN_SVAL("by", &me->by)
46 OUTPUT_OPTION_TOKEN_SVAL("complete_label", &me->complete_label)
47 OUTPUT_OPTION_TOKEN_SVAL("for", &me->fur)
48 OUTPUT_OPTION_TOKEN_BVAL("generic", &me->generic)
49 OUTPUT_OPTION_TOKEN_SVAL("MIC-md5", &me->MIC_md5)
50 OUTPUT_OPTION_TOKEN_DVAL("on", &me->on)
51 OUTPUT_OPTION_TOKEN_SVAL("signature-PKCS", &me->signature_PKCS)
52 OUTPUT_OPTION_TOKEN_DVAL("until", &me->until)
53 comments = me->comments;
54 while ((comment = (char *)HTList_nextObject(comments)))
55 ps(pStream, "comment \"%s\" ", comment);
56 return HT_OK;
57 }
58
Range_output(Range_t * pRange,HTStream * pStream)59 PRIVATE int Range_output(Range_t * pRange, HTStream * pStream)
60 {
61 ps(pStream, "%.1f", FVal_value(&pRange->min));
62 if (FVal_initialized(&pRange->max))
63 ps(pStream, ":%.1f", FVal_value(&pRange->max));
64 ps(pStream, " ");
65 return HT_OK;
66 }
67
68 #define LPARENSTR "("
69 #define RPARENSTR ")"
70
71 PRIVATE CSLabel_callback_t CSLLOut_outputRatings;
CSLLOut_outputRatings(CSLabel_t * pCSLabel,State_Parms_t * pParms,const char * identifier,void * pVoid)72 PRIVATE CSError_t CSLLOut_outputRatings(CSLabel_t * pCSLabel, State_Parms_t * pParms, const char * identifier, void * pVoid)
73 {
74 Range_t * pRange;
75 LabelRating_t * pLabelRating = CSLabel_getLabelRating(pCSLabel);
76 ps(pParms->pStream, "%s ", SVal_value(&pLabelRating->identifier));
77 if (FVal_initialized(&pLabelRating->value))
78 ps(pParms->pStream, "%.1f ", FVal_value(&pLabelRating->value));
79 if (pLabelRating->ranges) {
80 HTList * ranges = pLabelRating->ranges;
81 ps(pParms->pStream, LPARENSTR);
82 while ((pRange = (Range_t *) HTList_nextObject(ranges)))
83 Range_output(pRange, pParms->pStream);
84 ps(pParms->pStream, RPARENSTR);
85 }
86 return HT_OK;
87 }
88
89 PRIVATE CSLabel_callback_t CSLLOut_outputSingleLabel;
CSLLOut_outputSingleLabel(CSLabel_t * pCSLabel,State_Parms_t * pParms,const char * identifier,void * pVoid)90 PRIVATE CSError_t CSLLOut_outputSingleLabel(CSLabel_t * pCSLabel, State_Parms_t * pParms, const char * identifier, void * pVoid)
91 {
92 CSError_t ret;
93 SingleLabel_t * pSingleLabel = CSLabel_getSingleLabel(pCSLabel);
94 LabelOptions_output(pSingleLabel->pLabelOptions, pParms->pStream);
95 ps(pParms->pStream, "r "LPARENSTR);
96 ret = CSLabel_iterateLabelRatings(pParms->pCSLabel, CSLLOut_outputRatings, pParms, 0, 0);
97 ps(pParms->pStream, RPARENSTR" ");
98 return ret;
99 }
100
101 PRIVATE CSLabel_callback_t CSLLOut_outputLabel;
CSLLOut_outputLabel(CSLabel_t * pCSLabel,State_Parms_t * pParms,const char * identifier,void * pVoid)102 PRIVATE CSError_t CSLLOut_outputLabel(CSLabel_t * pCSLabel, State_Parms_t * pParms, const char * identifier, void * pVoid)
103 {
104 CSError_t ret;
105 Label_t * pLabel = CSLabel_getLabel(pCSLabel);
106 if (pLabel->singleLabels)
107 ps(pParms->pStream, LPARENSTR" ");
108 ret = CSLabel_iterateSingleLabels(pParms->pCSLabel, CSLLOut_outputSingleLabel, pParms, 0, 0);
109 if (pLabel->singleLabels)
110 ps(pParms->pStream, RPARENSTR" ");
111 return ret;
112 }
113
114 PRIVATE CSLabel_callback_t CSLLOut_outputService;
CSLLOut_outputService(CSLabel_t * pCSLabel,State_Parms_t * pParms,const char * identifier,void * pVoid)115 PRIVATE CSError_t CSLLOut_outputService(CSLabel_t * pCSLabel, State_Parms_t * pParms, const char * identifier, void * pVoid)
116 {
117 CSError_t ret;
118 ServiceInfo_t * pServiceInfo = CSLabel_getServiceInfo(pCSLabel);
119 if (!SVal_initialized(&pServiceInfo->rating_service)) {
120 ps(pParms->pStream, "%s ", "<service error>");
121 return HT_OK;
122 }
123 ps(pParms->pStream, "\"%s\" ", SVal_value(&pServiceInfo->rating_service));
124 LabelOptions_output(pServiceInfo->pLabelOptions, pParms->pStream);
125 ps(pParms->pStream, "l ");
126 ret = CSLabel_iterateLabels(pParms->pCSLabel, CSLLOut_outputLabel, pParms, 0, pVoid);
127 return ret;
128 }
129
CSLabel_output(CSLabel_t * pCSLabel,HTStream * pStream)130 PUBLIC int CSLabel_output(CSLabel_t * pCSLabel, HTStream * pStream)
131 {
132 CSError_t ret;
133 State_Parms_t parms;
134 parms.pCSLabel = pCSLabel;
135 parms.pStream = pStream;
136 ps(parms.pStream, LPARENSTR"PICS-%.1f ", FVal_value(&CSLabel_getCSLLData(pCSLabel)->version));
137 ret = CSLabel_iterateServices(parms.pCSLabel, CSLLOut_outputService, &parms, 0, 0);
138 ps(parms.pStream, RPARENSTR"\n");
139 return ret;
140 }
141
142 extern HTStream * Kwik_new (void);
143 extern int Kwik_free (HTStream * me);
144
CSLabel_dump(CSLabel_t * pCSLabel)145 PUBLIC void CSLabel_dump(CSLabel_t * pCSLabel)
146 {
147 HTStream * pKwik = Kwik_new();
148 CSLabel_t * pCSLabelCopy = CSLabel_copy(pCSLabel);
149 CSLabel_output(pCSLabelCopy, pKwik);
150 CSLabel_free(pCSLabelCopy);
151 Kwik_free(pKwik);
152 }
153
154