1141cc406Sopenharmony_ci#!/usr/bin/env python
2141cc406Sopenharmony_ci
3141cc406Sopenharmony_cifrom __future__ import print_function
4141cc406Sopenharmony_ciimport sys,os,re
5141cc406Sopenharmony_ciimport functools
6141cc406Sopenharmony_ci
7141cc406Sopenharmony_ciclass Error(Exception):
8141cc406Sopenharmony_ci    pass
9141cc406Sopenharmony_ci
10141cc406Sopenharmony_ci
11141cc406Sopenharmony_ciclass ParseError(Error):
12141cc406Sopenharmony_ci    def __init__(self, errline):
13141cc406Sopenharmony_ci        Error.__init__(self, errline)
14141cc406Sopenharmony_ci
15141cc406Sopenharmony_ci
16141cc406Sopenharmony_ciclass Struct:
17141cc406Sopenharmony_ci    pass
18141cc406Sopenharmony_ci
19141cc406Sopenharmony_ci
20141cc406Sopenharmony_cidef createCNameMap():
21141cc406Sopenharmony_ci    t = ''
22141cc406Sopenharmony_ci    for i in range(256):
23141cc406Sopenharmony_ci        if ((ord('A') <= i) and (i <= ord('Z'))) or \
24141cc406Sopenharmony_ci               ((ord('a') <= i) and (i <= ord('z'))) or \
25141cc406Sopenharmony_ci               ((ord('0') <= i) and (i <= ord('9'))):
26141cc406Sopenharmony_ci            t += chr(i)
27141cc406Sopenharmony_ci        else:
28141cc406Sopenharmony_ci            t += '_'
29141cc406Sopenharmony_ci    return t
30141cc406Sopenharmony_ci
31141cc406Sopenharmony_ci
32141cc406Sopenharmony_cidef seekBegin(f):
33141cc406Sopenharmony_ci    while True:
34141cc406Sopenharmony_ci        line = f.readline()
35141cc406Sopenharmony_ci        if not line:
36141cc406Sopenharmony_ci            return False
37141cc406Sopenharmony_ci        if line.startswith('BEGIN SANE_Option_Descriptor'):
38141cc406Sopenharmony_ci            return True
39141cc406Sopenharmony_ci
40141cc406Sopenharmony_ci
41141cc406Sopenharmony_cidef parseVerbatim(o, line):
42141cc406Sopenharmony_ci    words = line.split(None, 1)
43141cc406Sopenharmony_ci    if (len(words) < 2) or (words[1][0] != '@'):
44141cc406Sopenharmony_ci        return False
45141cc406Sopenharmony_ci    o[words[0]] = words[1]
46141cc406Sopenharmony_ci    return True
47141cc406Sopenharmony_ci
48141cc406Sopenharmony_ci
49141cc406Sopenharmony_cidef parseLine_type(o, line):
50141cc406Sopenharmony_ci    words = line.split(None, 2)
51141cc406Sopenharmony_ci    otype = words[1]
52141cc406Sopenharmony_ci    o['type'] = 'SANE_TYPE_' + otype.upper()
53141cc406Sopenharmony_ci    if otype == 'group':
54141cc406Sopenharmony_ci        g.ngroups += 1
55141cc406Sopenharmony_ci        oname = '_group_%d' % g.ngroups
56141cc406Sopenharmony_ci        o['size'] = 0
57141cc406Sopenharmony_ci    else:
58141cc406Sopenharmony_ci        temp = words[2]
59141cc406Sopenharmony_ci        idx = temp.find('[')
60141cc406Sopenharmony_ci        if idx == -1:
61141cc406Sopenharmony_ci            oname = temp
62141cc406Sopenharmony_ci            o['size'] = 1
63141cc406Sopenharmony_ci        else:
64141cc406Sopenharmony_ci            oname = temp[0:idx]
65141cc406Sopenharmony_ci            o['size'] = int(temp[idx+1:-1])
66141cc406Sopenharmony_ci    o['name'] = oname
67141cc406Sopenharmony_ci
68141cc406Sopenharmony_ci
69141cc406Sopenharmony_cidef parseLine_title(o, line):
70141cc406Sopenharmony_ci    o['title'] = line.split(None, 1)[1]
71141cc406Sopenharmony_ci
72141cc406Sopenharmony_ci
73141cc406Sopenharmony_cidef parseLine_desc(o, line):
74141cc406Sopenharmony_ci    o['desc'] = line.split(None, 1)[1]
75141cc406Sopenharmony_ci
76141cc406Sopenharmony_ci
77141cc406Sopenharmony_cidef parseLine_unit(o, line):
78141cc406Sopenharmony_ci    o['unit'] = 'SANE_UNIT_' + line.split(None, 1)[1].upper()
79141cc406Sopenharmony_ci
80141cc406Sopenharmony_ci
81141cc406Sopenharmony_cidef parseLine_default(o, line):
82141cc406Sopenharmony_ci    o['default'] = line.split(None, 1)[1]
83141cc406Sopenharmony_ci
84141cc406Sopenharmony_ci
85141cc406Sopenharmony_cidef parseLine_cap(o, line):
86141cc406Sopenharmony_ci    words = line.split()
87141cc406Sopenharmony_ci    o['cap'] = ['SANE_CAP_' + s.upper() for s in words[1:]]
88141cc406Sopenharmony_ci
89141cc406Sopenharmony_ci
90141cc406Sopenharmony_cidef parseLine_constraint(o, line):
91141cc406Sopenharmony_ci    c = line.split(None,1)[1]
92141cc406Sopenharmony_ci    if c[0] == '{':
93141cc406Sopenharmony_ci        o['constraint'] = c[1:-1].split('|')
94141cc406Sopenharmony_ci    elif c[0] == '(':
95141cc406Sopenharmony_ci        o['constraint'] = tuple(c[1:-1].split(','))
96141cc406Sopenharmony_ci    else:
97141cc406Sopenharmony_ci        sys.stderr.write('Ignored: %s\n' % line)
98141cc406Sopenharmony_ci
99141cc406Sopenharmony_ci
100141cc406Sopenharmony_cidef parseLine_info(o, line):
101141cc406Sopenharmony_ci    words = line.split()
102141cc406Sopenharmony_ci    o['info'] = ['SANE_INFO_' + s.upper() for s in words[1:]]
103141cc406Sopenharmony_ci
104141cc406Sopenharmony_cidef parseLine_rem(o, line):
105141cc406Sopenharmony_ci    pass
106141cc406Sopenharmony_ci
107141cc406Sopenharmony_cidef normalize(o):
108141cc406Sopenharmony_ci    if 'cname' not in o:
109141cc406Sopenharmony_ci        cname = o['name'].translate(cnameMap)
110141cc406Sopenharmony_ci        o['cname'] = cname
111141cc406Sopenharmony_ci    else:
112141cc406Sopenharmony_ci        cname = o['cname']
113141cc406Sopenharmony_ci    o['cname_opt'] = 'opt_' + cname
114141cc406Sopenharmony_ci    o['cname_con'] = 'constraint_' + cname
115141cc406Sopenharmony_ci    if 'title' not in o:
116141cc406Sopenharmony_ci        o['title'] = 'NO TITLE'
117141cc406Sopenharmony_ci    if 'desc' not in o:
118141cc406Sopenharmony_ci        o['desc'] = '@sod->title' % o
119141cc406Sopenharmony_ci    if 'unit' not in o:
120141cc406Sopenharmony_ci        o['unit'] = 'SANE_UNIT_NONE'
121141cc406Sopenharmony_ci    if 'constraint_type' not in o:
122141cc406Sopenharmony_ci        if 'constraint' not in o:
123141cc406Sopenharmony_ci            ct = 'SANE_CONSTRAINT_NONE'
124141cc406Sopenharmony_ci        elif isinstance(o['constraint'], list):
125141cc406Sopenharmony_ci            if o['type'] == 'SANE_TYPE_STRING':
126141cc406Sopenharmony_ci                ct = 'SANE_CONSTRAINT_STRING_LIST'
127141cc406Sopenharmony_ci            else:
128141cc406Sopenharmony_ci                ct = 'SANE_CONSTRAINT_WORD_LIST'
129141cc406Sopenharmony_ci        elif isinstance(o['constraint'], tuple):
130141cc406Sopenharmony_ci            ct = 'SANE_CONSTRAINT_RANGE'
131141cc406Sopenharmony_ci        elif isinstance(o['constraint'], str):
132141cc406Sopenharmony_ci            oc = o['constraint']
133141cc406Sopenharmony_ci            if oc.startswith('@range'):
134141cc406Sopenharmony_ci                ct = 'SANE_CONSTRAINT_RANGE'
135141cc406Sopenharmony_ci            elif oc.startswith('@word_list'):
136141cc406Sopenharmony_ci                ct = 'SANE_CONSTRAINT_WORD_LIST'
137141cc406Sopenharmony_ci            elif oc.startswith('@string_list'):
138141cc406Sopenharmony_ci                ct = 'SANE_CONSTRAINT_STRING_LIST'
139141cc406Sopenharmony_ci        o['constraint_type'] = ct
140141cc406Sopenharmony_ci    return o
141141cc406Sopenharmony_ci
142141cc406Sopenharmony_ci
143141cc406Sopenharmony_cidef parseFile(f):
144141cc406Sopenharmony_ci    if not seekBegin(f):
145141cc406Sopenharmony_ci        return None
146141cc406Sopenharmony_ci    options = [ {
147141cc406Sopenharmony_ci        'name' : '',
148141cc406Sopenharmony_ci        'cname' : 'opt_num_opts',
149141cc406Sopenharmony_ci        'title' : '@SANE_TITLE_NUM_OPTIONS',
150141cc406Sopenharmony_ci        'desc' : '@SANE_DESC_NUM_OPTIONS',
151141cc406Sopenharmony_ci        'type' : 'SANE_TYPE_INT',
152141cc406Sopenharmony_ci        'unit' : 'SANE_UNIT_NONE',
153141cc406Sopenharmony_ci        'size' : 1,
154141cc406Sopenharmony_ci        'cap' : ['SANE_CAP_SOFT_DETECT'],
155141cc406Sopenharmony_ci        'constraint_type' : 'SANE_CONSTRAINT_NONE',
156141cc406Sopenharmony_ci        'default' : '@w = ' + opt_prefix + 'last'
157141cc406Sopenharmony_ci        } ]
158141cc406Sopenharmony_ci    o = {}
159141cc406Sopenharmony_ci    while True:
160141cc406Sopenharmony_ci        line = f.readline()
161141cc406Sopenharmony_ci        if not line:
162141cc406Sopenharmony_ci            break
163141cc406Sopenharmony_ci        line = line.strip()
164141cc406Sopenharmony_ci        if not line:
165141cc406Sopenharmony_ci            continue
166141cc406Sopenharmony_ci        token = line.split(None, 1)[0].lower()
167141cc406Sopenharmony_ci        if token == 'end':
168141cc406Sopenharmony_ci            break
169141cc406Sopenharmony_ci        if token == 'type':
170141cc406Sopenharmony_ci            if 'name' in o:
171141cc406Sopenharmony_ci                options.append(o)
172141cc406Sopenharmony_ci            o = {}
173141cc406Sopenharmony_ci        funcName = 'parseLine_' + token
174141cc406Sopenharmony_ci        if funcName in globals():
175141cc406Sopenharmony_ci            if not parseVerbatim(o, line):
176141cc406Sopenharmony_ci                func = globals()[funcName]
177141cc406Sopenharmony_ci                func(o, line)
178141cc406Sopenharmony_ci        else:
179141cc406Sopenharmony_ci            sys.stderr.write('Skip: %s\n' % line)
180141cc406Sopenharmony_ci    if 'name' in o:
181141cc406Sopenharmony_ci        options.append(o)
182141cc406Sopenharmony_ci    return [normalize(o) for o in options]
183141cc406Sopenharmony_ci
184141cc406Sopenharmony_ci
185141cc406Sopenharmony_cidef genHeader(options):
186141cc406Sopenharmony_ci    print ("\ntypedef union {")
187141cc406Sopenharmony_ci    print ("  SANE_Word w;")
188141cc406Sopenharmony_ci    print ("  SANE_Int  i;")
189141cc406Sopenharmony_ci    print ("  SANE_Bool b;")
190141cc406Sopenharmony_ci    print ("  SANE_Fixed f;")
191141cc406Sopenharmony_ci    print ("  SANE_String s;")
192141cc406Sopenharmony_ci    print ("  void *ptr;")
193141cc406Sopenharmony_ci    print ("} option_value_t;")
194141cc406Sopenharmony_ci    print ("\ntypedef enum {")
195141cc406Sopenharmony_ci    for o in options:
196141cc406Sopenharmony_ci        print ("  %(cname_opt)s," % o)
197141cc406Sopenharmony_ci    print ("  " + opt_prefix + "last")
198141cc406Sopenharmony_ci    print ("} option_t;")
199141cc406Sopenharmony_ci
200141cc406Sopenharmony_ci    print ("\ntypedef struct {")
201141cc406Sopenharmony_ci    print ("  SANE_Option_Descriptor sod;")
202141cc406Sopenharmony_ci    print ("  option_value_t val,def;")
203141cc406Sopenharmony_ci    print ("  SANE_Word info;")
204141cc406Sopenharmony_ci    print ("} option_descriptor_t;")
205141cc406Sopenharmony_ci
206141cc406Sopenharmony_ci    print ("\nstruct pixma_sane_t;")
207141cc406Sopenharmony_ci    print ("static int build_option_descriptors(struct pixma_sane_t *ss);\n")
208141cc406Sopenharmony_ci
209141cc406Sopenharmony_ci
210141cc406Sopenharmony_cidef genMinMaxRange(n, t, r):
211141cc406Sopenharmony_ci    if t == 'SANE_TYPE_FIXED':
212141cc406Sopenharmony_ci        r = ['SANE_FIX(%s)' % x for x in r]
213141cc406Sopenharmony_ci    print ("static const SANE_Range " + n + " =")
214141cc406Sopenharmony_ci    print ("  { " + r[0] + "," + r[1] + "," + r[2] + " };")
215141cc406Sopenharmony_ci
216141cc406Sopenharmony_ci
217141cc406Sopenharmony_cidef genList(n, t, l):
218141cc406Sopenharmony_ci    if t == 'SANE_TYPE_INT':
219141cc406Sopenharmony_ci        etype = 'SANE_Word'
220141cc406Sopenharmony_ci        l = [str(len(l))] + l
221141cc406Sopenharmony_ci    elif t == 'SANE_TYPE_FIXED':
222141cc406Sopenharmony_ci        etype = 'SANE_Word'
223141cc406Sopenharmony_ci        l = [str(len(l))] + ['SANE_FIX(%s)' % x for x in l]
224141cc406Sopenharmony_ci    elif t == 'SANE_TYPE_STRING':
225141cc406Sopenharmony_ci        etype = 'SANE_String_Const'
226141cc406Sopenharmony_ci        l = ['SANE_I18N("%s")' % x for x in l] + ['NULL']
227141cc406Sopenharmony_ci    print ("static const %s %s[%d] = {" % (etype, n, len(l)))
228141cc406Sopenharmony_ci    for x in l[0:-1]:
229141cc406Sopenharmony_ci        print ("\t" + x + ",")
230141cc406Sopenharmony_ci    print ("\t" + l[-1] + " };")
231141cc406Sopenharmony_ci
232141cc406Sopenharmony_ci
233141cc406Sopenharmony_cidef genConstraints(options):
234141cc406Sopenharmony_ci    print ("")
235141cc406Sopenharmony_ci    for o in options:
236141cc406Sopenharmony_ci        if 'constraint' not in o: continue
237141cc406Sopenharmony_ci        c = o['constraint']
238141cc406Sopenharmony_ci        oname = o['cname_con']
239141cc406Sopenharmony_ci        otype = o['type']
240141cc406Sopenharmony_ci        if isinstance(c, tuple):
241141cc406Sopenharmony_ci            genMinMaxRange(oname, otype, c)
242141cc406Sopenharmony_ci        elif isinstance(c, list):
243141cc406Sopenharmony_ci            genList(oname, otype, c)
244141cc406Sopenharmony_ci
245141cc406Sopenharmony_cidef buildCodeVerbatim(o):
246141cc406Sopenharmony_ci    for f in ('name', 'title', 'desc', 'type', 'unit', 'size', 'cap',
247141cc406Sopenharmony_ci              'constraint_type', 'constraint', 'default'):
248141cc406Sopenharmony_ci        if (f not in o): continue
249141cc406Sopenharmony_ci        temp = o[f]
250141cc406Sopenharmony_ci        if (not isinstance(temp,str)) or \
251141cc406Sopenharmony_ci           (len(temp) < 1) or (temp[0] != '@'):
252141cc406Sopenharmony_ci            continue
253141cc406Sopenharmony_ci        o['code_' + f] = temp[1:]
254141cc406Sopenharmony_ci
255141cc406Sopenharmony_cidef ccode(o):
256141cc406Sopenharmony_ci    buildCodeVerbatim(o)
257141cc406Sopenharmony_ci    if 'code_name' not in o:
258141cc406Sopenharmony_ci        o['code_name'] = '"' + o['name'] + '"'
259141cc406Sopenharmony_ci    for f in ('title', 'desc'):
260141cc406Sopenharmony_ci        cf = 'code_' + f
261141cc406Sopenharmony_ci        if cf in o: continue
262141cc406Sopenharmony_ci        o[cf] = 'SANE_I18N("' + o[f] + '")'
263141cc406Sopenharmony_ci
264141cc406Sopenharmony_ci    for f in ('type', 'unit', 'constraint_type'):
265141cc406Sopenharmony_ci        cf = 'code_' + f
266141cc406Sopenharmony_ci        if cf in o: continue
267141cc406Sopenharmony_ci        o[cf] = o[f]
268141cc406Sopenharmony_ci
269141cc406Sopenharmony_ci    if 'code_size' not in o:
270141cc406Sopenharmony_ci        otype = o['type']
271141cc406Sopenharmony_ci        osize = o['size']
272141cc406Sopenharmony_ci        if otype == 'SANE_TYPE_STRING':
273141cc406Sopenharmony_ci            code = str(osize + 1)
274141cc406Sopenharmony_ci        elif otype == 'SANE_TYPE_INT' or otype == 'SANE_TYPE_FIXED':
275141cc406Sopenharmony_ci            code = str(osize) + ' * sizeof(SANE_Word)'
276141cc406Sopenharmony_ci        elif otype == 'SANE_TYPE_BUTTON':
277141cc406Sopenharmony_ci            code = '0'
278141cc406Sopenharmony_ci        else:
279141cc406Sopenharmony_ci            code = 'sizeof(SANE_Word)'
280141cc406Sopenharmony_ci        o['code_size'] = code
281141cc406Sopenharmony_ci
282141cc406Sopenharmony_ci    if ('code_cap' not in o) and ('cap' in o):
283141cc406Sopenharmony_ci        o['code_cap'] = functools.reduce(lambda a,b: a+'|'+b, o['cap'])
284141cc406Sopenharmony_ci    else:
285141cc406Sopenharmony_ci        o['code_cap'] = '0'
286141cc406Sopenharmony_ci
287141cc406Sopenharmony_ci    if ('code_info' not in o) and ('info' in o):
288141cc406Sopenharmony_ci        o['code_info'] = functools.reduce(lambda a,b: a+'|'+b, o['info'])
289141cc406Sopenharmony_ci    else:
290141cc406Sopenharmony_ci        o['code_info'] = '0'
291141cc406Sopenharmony_ci
292141cc406Sopenharmony_ci    if ('code_default' not in o) and ('default' in o):
293141cc406Sopenharmony_ci        odefault = o['default']
294141cc406Sopenharmony_ci        otype = o['type']
295141cc406Sopenharmony_ci        if odefault == '_MIN':
296141cc406Sopenharmony_ci            rhs = 'w = sod->constraint.range->min'
297141cc406Sopenharmony_ci        elif odefault == '_MAX':
298141cc406Sopenharmony_ci            rhs = 'w = sod->constraint.range->max'
299141cc406Sopenharmony_ci        elif otype in ('SANE_TYPE_INT', 'SANE_TYPE_BOOL'):
300141cc406Sopenharmony_ci            rhs = 'w = %(default)s'
301141cc406Sopenharmony_ci        elif otype == 'SANE_TYPE_FIXED':
302141cc406Sopenharmony_ci            rhs = 'w = SANE_FIX(%(default)s)'
303141cc406Sopenharmony_ci        elif otype == 'SANE_TYPE_STRING':
304141cc406Sopenharmony_ci            rhs = 's = SANE_I18N("%(default)s")'
305141cc406Sopenharmony_ci        o['code_default'] = rhs % o
306141cc406Sopenharmony_ci    if 'code_default' in o:
307141cc406Sopenharmony_ci        code = '  opt->def.%(code_default)s;\n'
308141cc406Sopenharmony_ci        if o['constraint_type'] != 'SANE_CONSTRAINT_STRING_LIST':
309141cc406Sopenharmony_ci            code += '  opt->val.%(code_default)s;\n'
310141cc406Sopenharmony_ci        else:
311141cc406Sopenharmony_ci            code += '  opt->val.w = find_string_in_list' \
312141cc406Sopenharmony_ci                    '(opt->def.s, sod->constraint.string_list);\n'
313141cc406Sopenharmony_ci        o['full_code_default'] = code % o
314141cc406Sopenharmony_ci    else:
315141cc406Sopenharmony_ci        o['full_code_default'] = ''
316141cc406Sopenharmony_ci
317141cc406Sopenharmony_ci    if ('code_constraint' not in o) and ('constraint' in o):
318141cc406Sopenharmony_ci        ct = o['constraint_type']
319141cc406Sopenharmony_ci        idx = len('SANE_CONSTRAINT_')
320141cc406Sopenharmony_ci        ctype = ct[idx:].lower()
321141cc406Sopenharmony_ci        if ctype == 'range':
322141cc406Sopenharmony_ci            rhs = '&%(cname_con)s' % o
323141cc406Sopenharmony_ci        else:
324141cc406Sopenharmony_ci            rhs = '%(cname_con)s' % o
325141cc406Sopenharmony_ci        o['code_constraint'] = ctype + ' = ' + rhs
326141cc406Sopenharmony_ci    if 'code_constraint' in o:
327141cc406Sopenharmony_ci        code = '  sod->constraint.%(code_constraint)s;\n'
328141cc406Sopenharmony_ci        o['full_code_constraint'] = code % o
329141cc406Sopenharmony_ci    else:
330141cc406Sopenharmony_ci        o['full_code_constraint'] = ''
331141cc406Sopenharmony_ci
332141cc406Sopenharmony_ci    return o
333141cc406Sopenharmony_ci
334141cc406Sopenharmony_cidef genBuildOptions(options):
335141cc406Sopenharmony_ci  print ("\nstatic")
336141cc406Sopenharmony_ci  print ("int find_string_in_list(SANE_String_Const str, const SANE_String_Const *list)")
337141cc406Sopenharmony_ci  print ("{")
338141cc406Sopenharmony_ci  print ("  int i;")
339141cc406Sopenharmony_ci  print ("  for (i = 0; list[i] && strcmp(str, list[i]) != 0; i++) {}")
340141cc406Sopenharmony_ci  print ("  return i;")
341141cc406Sopenharmony_ci  print ("}")
342141cc406Sopenharmony_ci  print ("")
343141cc406Sopenharmony_ci  print ("static")
344141cc406Sopenharmony_ci  print ("int build_option_descriptors(struct pixma_sane_t *ss)")
345141cc406Sopenharmony_ci  print ("{")
346141cc406Sopenharmony_ci  print ("  SANE_Option_Descriptor *sod;")
347141cc406Sopenharmony_ci  print ("  option_descriptor_t *opt;")
348141cc406Sopenharmony_ci  print ("")
349141cc406Sopenharmony_ci  print ("  memset(OPT_IN_CTX, 0, sizeof(OPT_IN_CTX));")
350141cc406Sopenharmony_ci
351141cc406Sopenharmony_ci  for o in options:
352141cc406Sopenharmony_ci      o = ccode(o)
353141cc406Sopenharmony_ci      otype = o['type']
354141cc406Sopenharmony_ci      code = '\n  opt = &(OPT_IN_CTX[%(cname_opt)s]);\n' \
355141cc406Sopenharmony_ci             '  sod = &opt->sod;\n' \
356141cc406Sopenharmony_ci             '  sod->type = %(code_type)s;\n' \
357141cc406Sopenharmony_ci             '  sod->title = %(code_title)s;\n' \
358141cc406Sopenharmony_ci             '  sod->desc = %(code_desc)s;\n'
359141cc406Sopenharmony_ci      if otype != 'SANE_TYPE_GROUP':
360141cc406Sopenharmony_ci          code += '  sod->name = %(code_name)s;\n' \
361141cc406Sopenharmony_ci                  '  sod->unit = %(code_unit)s;\n' \
362141cc406Sopenharmony_ci                  '  sod->size = %(code_size)s;\n' \
363141cc406Sopenharmony_ci                  '  sod->cap  = %(code_cap)s;\n' \
364141cc406Sopenharmony_ci                  '  sod->constraint_type = %(code_constraint_type)s;\n' \
365141cc406Sopenharmony_ci                  '%(full_code_constraint)s' \
366141cc406Sopenharmony_ci                  '  OPT_IN_CTX[%(cname_opt)s].info = %(code_info)s;\n' \
367141cc406Sopenharmony_ci                  '%(full_code_default)s'
368141cc406Sopenharmony_ci      sys.stdout.write(code % o)
369141cc406Sopenharmony_ci  print ("")
370141cc406Sopenharmony_ci  print ("  return 0;")
371141cc406Sopenharmony_ci  print ("}\n")
372141cc406Sopenharmony_ci
373141cc406Sopenharmony_cig = Struct()
374141cc406Sopenharmony_cig.ngroups = 0
375141cc406Sopenharmony_ciopt_prefix = 'opt_'
376141cc406Sopenharmony_cicon_prefix = 'constraint_'
377141cc406Sopenharmony_cicnameMap = createCNameMap()
378141cc406Sopenharmony_cioptions = parseFile(sys.stdin)
379141cc406Sopenharmony_ciprint ("/* DO NOT EDIT THIS FILE! */")
380141cc406Sopenharmony_ciprint ("/* Automatically generated from pixma.c */")
381141cc406Sopenharmony_ciif (len(sys.argv) == 2) and (sys.argv[1] == 'h'):
382141cc406Sopenharmony_ci    genHeader(options)
383141cc406Sopenharmony_cielse:
384141cc406Sopenharmony_ci    genConstraints(options)
385141cc406Sopenharmony_ci    genBuildOptions(options)
386