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