xref: /inferno-os/libfreetype/otlbase.c (revision 37da2899f40661e3e9631e497da8dc59b971cbd0)
1*37da2899SCharles.Forsyth #include "otlbase.h"
2*37da2899SCharles.Forsyth #include "otlcommn.h"
3*37da2899SCharles.Forsyth 
4*37da2899SCharles.Forsyth   static void
otl_base_coord_validate(OTL_Bytes table,OTL_Validator valid)5*37da2899SCharles.Forsyth   otl_base_coord_validate( OTL_Bytes      table,
6*37da2899SCharles.Forsyth                            OTL_Validator  valid )
7*37da2899SCharles.Forsyth   {
8*37da2899SCharles.Forsyth     OTL_Bytes  p = table;
9*37da2899SCharles.Forsyth     OTL_UInt   format;
10*37da2899SCharles.Forsyth 
11*37da2899SCharles.Forsyth     OTL_CHECK( 4 );
12*37da2899SCharles.Forsyth 
13*37da2899SCharles.Forsyth     format = OTL_NEXT_USHORT( p );
14*37da2899SCharles.Forsyth     p += 2;
15*37da2899SCharles.Forsyth 
16*37da2899SCharles.Forsyth     switch ( format )
17*37da2899SCharles.Forsyth     {
18*37da2899SCharles.Forsyth       case 1:
19*37da2899SCharles.Forsyth         break;
20*37da2899SCharles.Forsyth 
21*37da2899SCharles.Forsyth       case 2:
22*37da2899SCharles.Forsyth         OTL_CHECK( 4 );
23*37da2899SCharles.Forsyth         break;
24*37da2899SCharles.Forsyth 
25*37da2899SCharles.Forsyth       case 3:
26*37da2899SCharles.Forsyth         OTL_CHECK( 2 );
27*37da2899SCharles.Forsyth         otl_device_table_validate( table + OTL_PEEK_USHORT( p ) );
28*37da2899SCharles.Forsyth         break;
29*37da2899SCharles.Forsyth 
30*37da2899SCharles.Forsyth       default:
31*37da2899SCharles.Forsyth         OTL_INVALID_DATA;
32*37da2899SCharles.Forsyth     }
33*37da2899SCharles.Forsyth   }
34*37da2899SCharles.Forsyth 
35*37da2899SCharles.Forsyth 
36*37da2899SCharles.Forsyth   static void
otl_base_tag_list_validate(OTL_Bytes table,OTL_Validator valid)37*37da2899SCharles.Forsyth   otl_base_tag_list_validate( OTL_Bytes      table,
38*37da2899SCharles.Forsyth                               OTL_Validator  valid )
39*37da2899SCharles.Forsyth   {
40*37da2899SCharles.Forsyth     OTL_Bytes  p = table;
41*37da2899SCharles.Forsyth     OTL_UInt   count;
42*37da2899SCharles.Forsyth 
43*37da2899SCharles.Forsyth     OTL_CHECK(2);
44*37da2899SCharles.Forsyth 
45*37da2899SCharles.Forsyth     count = OTL_NEXT_USHORT( p );
46*37da2899SCharles.Forsyth     OTL_CHECK( count*4 );
47*37da2899SCharles.Forsyth   }
48*37da2899SCharles.Forsyth 
49*37da2899SCharles.Forsyth 
50*37da2899SCharles.Forsyth 
51*37da2899SCharles.Forsyth   static void
otl_base_values_validate(OTL_Bytes table,OTL_Validator valid)52*37da2899SCharles.Forsyth   otl_base_values_validate( OTL_Bytes      table,
53*37da2899SCharles.Forsyth                             OTL_Validator  valid )
54*37da2899SCharles.Forsyth   {
55*37da2899SCharles.Forsyth     OTL_Bytes  p = table;
56*37da2899SCharles.Forsyth     OTL_UInt   count;
57*37da2899SCharles.Forsyth 
58*37da2899SCharles.Forsyth     OTL_CHECK( 4 );
59*37da2899SCharles.Forsyth 
60*37da2899SCharles.Forsyth     p    += 2;  /* skip default index */
61*37da2899SCharles.Forsyth     count = OTL_NEXT_USHORT( p );
62*37da2899SCharles.Forsyth 
63*37da2899SCharles.Forsyth     OTL_CHECK( count*2 );
64*37da2899SCharles.Forsyth 
65*37da2899SCharles.Forsyth     for ( ; count > 0; count-- )
66*37da2899SCharles.Forsyth       otl_base_coord_validate( table + OTL_NEXT_USHORT( p ), valid );
67*37da2899SCharles.Forsyth   }
68*37da2899SCharles.Forsyth 
69*37da2899SCharles.Forsyth 
70*37da2899SCharles.Forsyth   static void
otl_base_minmax_validate(OTL_Bytes table,OTL_Validator valid)71*37da2899SCharles.Forsyth   otl_base_minmax_validate( OTL_Bytes      table,
72*37da2899SCharles.Forsyth                             OTL_Validator  valid )
73*37da2899SCharles.Forsyth   {
74*37da2899SCharles.Forsyth     OTL_Bytes  p = table;
75*37da2899SCharles.Forsyth     OTL_UInt   min_coord, max_coord, count;
76*37da2899SCharles.Forsyth 
77*37da2899SCharles.Forsyth     OTL_CHECK(6);
78*37da2899SCharles.Forsyth     min_coord = OTL_NEXT_USHORT( p );
79*37da2899SCharles.Forsyth     max_coord = OTL_NEXT_USHORT( p );
80*37da2899SCharles.Forsyth     count     = OTL_NEXT_USHORT( p );
81*37da2899SCharles.Forsyth 
82*37da2899SCharles.Forsyth     if ( min_coord )
83*37da2899SCharles.Forsyth       otl_base_coord_validate( table + min_coord, valid );
84*37da2899SCharles.Forsyth 
85*37da2899SCharles.Forsyth     if ( max_coord )
86*37da2899SCharles.Forsyth       otl_base_coord_validate( table + max_coord, valid );
87*37da2899SCharles.Forsyth 
88*37da2899SCharles.Forsyth     OTL_CHECK( count*8 );
89*37da2899SCharles.Forsyth     for ( ; count > 0; count-- )
90*37da2899SCharles.Forsyth     {
91*37da2899SCharles.Forsyth       p += 4;  /* ignore tag */
92*37da2899SCharles.Forsyth       min_coord = OTL_NEXT_USHORT( p );
93*37da2899SCharles.Forsyth       max_coord = OTL_NEXT_USHORT( p );
94*37da2899SCharles.Forsyth 
95*37da2899SCharles.Forsyth       if ( min_coord )
96*37da2899SCharles.Forsyth         otl_base_coord_validate( table + min_coord, valid );
97*37da2899SCharles.Forsyth 
98*37da2899SCharles.Forsyth       if ( max_coord )
99*37da2899SCharles.Forsyth         otl_base_coord_validate( table + max_coord, valid );
100*37da2899SCharles.Forsyth     }
101*37da2899SCharles.Forsyth   }
102*37da2899SCharles.Forsyth 
103*37da2899SCharles.Forsyth 
104*37da2899SCharles.Forsyth   static void
otl_base_script_validate(OTL_Bytes table,OTL_Validator valid)105*37da2899SCharles.Forsyth   otl_base_script_validate( OTL_Bytes      table,
106*37da2899SCharles.Forsyth                             OTL_Validator  valid )
107*37da2899SCharles.Forsyth   {
108*37da2899SCharles.Forsyth     OTL_Bytes  p = table;
109*37da2899SCharles.Forsyth     OTL_UInt   values, default_minmax;
110*37da2899SCharles.Forsyth 
111*37da2899SCharles.Forsyth     OTL_CHECK(6);
112*37da2899SCharles.Forsyth 
113*37da2899SCharles.Forsyth     values         = OTL_NEXT_USHORT( p );
114*37da2899SCharles.Forsyth     default_minmax = OTL_NEXT_USHORT( p );
115*37da2899SCharles.Forsyth     count          = OTL_NEXT_USHORT( p );
116*37da2899SCharles.Forsyth 
117*37da2899SCharles.Forsyth     if ( values )
118*37da2899SCharles.Forsyth       otl_base_values_validate( table + values, valid );
119*37da2899SCharles.Forsyth 
120*37da2899SCharles.Forsyth     if ( default_minmax )
121*37da2899SCharles.Forsyth       otl_base_minmax_validate( table + default_minmax, valid );
122*37da2899SCharles.Forsyth 
123*37da2899SCharles.Forsyth     OTL_CHECK( count*6 );
124*37da2899SCharles.Forsyth     for ( ; count > 0; count-- )
125*37da2899SCharles.Forsyth     {
126*37da2899SCharles.Forsyth       p += 4;  /* ignore tag */
127*37da2899SCharles.Forsyth       otl_base_minmax_validate( table + OTL_NEXT_USHORT( p ), valid );
128*37da2899SCharles.Forsyth     }
129*37da2899SCharles.Forsyth   }
130*37da2899SCharles.Forsyth 
131*37da2899SCharles.Forsyth 
132*37da2899SCharles.Forsyth   static void
otl_base_script_list_validate(OTL_Bytes table,OTL_Validator valid)133*37da2899SCharles.Forsyth   otl_base_script_list_validate( OTL_Bytes      table,
134*37da2899SCharles.Forsyth                                  OTL_Validator  valid )
135*37da2899SCharles.Forsyth   {
136*37da2899SCharles.Forsyth     OTL_Bytes  p = table;
137*37da2899SCharles.Forsyth     OTL_UInt   count;
138*37da2899SCharles.Forsyth 
139*37da2899SCharles.Forsyth     OTL_CHECK(2);
140*37da2899SCharles.Forsyth 
141*37da2899SCharles.Forsyth     count = OTL_NEXT_USHORT( p );
142*37da2899SCharles.Forsyth     OTL_CHECK(count*6);
143*37da2899SCharles.Forsyth 
144*37da2899SCharles.Forsyth     for ( ; count > 0; count-- )
145*37da2899SCharles.Forsyth     {
146*37da2899SCharles.Forsyth       p += 4;  /* ignore script tag */
147*37da2899SCharles.Forsyth       otl_base_script_validate( table + OTL_NEXT_USHORT( p ) );
148*37da2899SCharles.Forsyth     }
149*37da2899SCharles.Forsyth   }
150*37da2899SCharles.Forsyth 
151*37da2899SCharles.Forsyth   static void
otl_axis_table_validate(OTL_Bytes table,OTL_Validator valid)152*37da2899SCharles.Forsyth   otl_axis_table_validate( OTL_Bytes      table,
153*37da2899SCharles.Forsyth                            OTL_Validator  valid )
154*37da2899SCharles.Forsyth   {
155*37da2899SCharles.Forsyth     OTL_Bytes  p = table;
156*37da2899SCharles.Forsyth     OTL_UInt   tags;
157*37da2899SCharles.Forsyth 
158*37da2899SCharles.Forsyth     OTL_CHECK(4);
159*37da2899SCharles.Forsyth 
160*37da2899SCharles.Forsyth     tags = OTL_NEXT_USHORT( p );
161*37da2899SCharles.Forsyth     if ( tags )
162*37da2899SCharles.Forsyth       otl_base_tag_list_validate   ( table + tags );
163*37da2899SCharles.Forsyth 
164*37da2899SCharles.Forsyth     otl_base_script_list_validate( table + OTL_NEXT_USHORT( p ) );
165*37da2899SCharles.Forsyth   }
166*37da2899SCharles.Forsyth 
167*37da2899SCharles.Forsyth 
168*37da2899SCharles.Forsyth   OTL_LOCALDEF( void )
otl_base_validate(OTL_Bytes table,OTL_Validator valid)169*37da2899SCharles.Forsyth   otl_base_validate( OTL_Bytes      table,
170*37da2899SCharles.Forsyth                      OTL_Validator  valid )
171*37da2899SCharles.Forsyth   {
172*37da2899SCharles.Forsyth     OTL_Bytes p = table;
173*37da2899SCharles.Forsyth 
174*37da2899SCharles.Forsyth     OTL_CHECK(6);
175*37da2899SCharles.Forsyth 
176*37da2899SCharles.Forsyth     if ( OTL_NEXT_ULONG( p ) != 0x10000UL )
177*37da2899SCharles.Forsyth       OTL_INVALID_DATA;
178*37da2899SCharles.Forsyth 
179*37da2899SCharles.Forsyth     otl_axis_table_validate( table + OTL_NEXT_USHORT( p ) );
180*37da2899SCharles.Forsyth     otl_axis_table_validate( table + OTL_NEXT_USHORT( p ) );
181*37da2899SCharles.Forsyth   }