123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105openMachdepmoduleR=StrmoduleL=ListmoduleH=Hashtblletpreparse(s:string):(string,stringlist)H.t=letspecTable=H.create32inletcommaRegexp=R.regexp","inletspaceRegexp=R.regexp"[ \t]+"inletspecRegexp=R.regexp"^\\([a-zA-Z_0-9]+\\)[ \t]*=\\(.*\\)$"inletspecs=R.splitspaceRegexpsinletaddSpecspec=ifR.string_matchspecRegexpspec0thenbeginletname=R.matched_group1specinletvalue=R.matched_group2specinH.addspecTablename(R.splitcommaRegexpvalue)endelseraise(Failure("invalid specification string "^spec))inL.iteraddSpecspecs;specTableleterrorWrapnamef=tryfnamewithNot_found->raise(Failure(name^" not specified"))|_->raise(Failure("invalid format for "^name))letgetNthStringnspecTablename=letl=H.findspecTablenameinL.nthlnletgetNthIntnspecTablename=errorWrapname(funname->int_of_string(getNthStringnspecTablename))letgetNthBoolnspecTablename=errorWrapname(funname->bool_of_string(getNthStringnspecTablename))letgetBool=getNthBool0letgetInt=getNthInt0letgetSizeof=getNthInt0letgetAlignof=getNthInt1letrespace=Str.global_replace(Str.regexp"_")" "letmodelParse(s:string):mach=letentries=trypreparseswithFailuremsg->raise(Failuremsg)|_->raise(Failure"invalid machine specification")in{version_major=0;version_minor=0;version="machine model "^s;underscore_name=getBoolentries"underscore_name";sizeof_short=getSizeofentries"short";alignof_short=getAlignofentries"short";sizeof_bool=getSizeofentries"bool";alignof_bool=getAlignofentries"bool";sizeof_int=getSizeofentries"int";alignof_int=getAlignofentries"int";sizeof_long=getSizeofentries"long";alignof_long=getAlignofentries"long";sizeof_longlong=getSizeofentries"long_long";alignof_longlong=getAlignofentries"long_long";sizeof_ptr=getSizeofentries"pointer";alignof_ptr=getAlignofentries"pointer";alignof_enum=getIntentries"alignof_enum";sizeof_float=getSizeofentries"float";alignof_float=getAlignofentries"float";sizeof_float32x=getSizeofentries"float32x";alignof_float32x=getAlignofentries"float32x";sizeof_float64x=getSizeofentries"float64x";alignof_float64x=getAlignofentries"float64x";sizeof_floatcomplex=getSizeofentries"float_complex";alignof_floatcomplex=getAlignofentries"float_complex";sizeof_double=getSizeofentries"double";alignof_double=getAlignofentries"double";sizeof_doublecomplex=getSizeofentries"double_complex";alignof_doublecomplex=getAlignofentries"double_complex";sizeof_longdouble=getSizeofentries"long_double";alignof_longdouble=getAlignofentries"long_double";sizeof_float128=getSizeofentries"float128";alignof_float128=getAlignofentries"float128";sizeof_longdoublecomplex=getSizeofentries"long_double_complex";alignof_longdoublecomplex=getAlignofentries"long_double_complex";sizeof_float128complex=getSizeofentries"float128_complex";alignof_float128complex=getAlignofentries"float128_complex";sizeof_void=getSizeofentries"void";sizeof_fun=getSizeofentries"fun";alignof_fun=getAlignofentries"fun";alignof_str=getIntentries"alignof_string";alignof_aligned=getIntentries"max_alignment";size_t=respace(getNthString0entries"size_t");wchar_t=respace(getNthString0entries"wchar_t");char16_t=respace(getNthString0entries"char16_t");char32_t=respace(getNthString0entries"char32_t");char_is_unsigned=not(getBoolentries"char_signed");little_endian=not(getBoolentries"big_endian");__thread_is_keyword=getBoolentries"__thread_is_keyword";__builtin_va_list=getBoolentries"__builtin_va_list";}