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